您好,登錄后才能下訂單哦!
這篇文章主要介紹“為什么用戶定義的轉換必須是轉換成封閉類型或從封閉類型轉換”,在日常操作中,相信很多人在為什么用戶定義的轉換必須是轉換成封閉類型或從封閉類型轉換問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”為什么用戶定義的轉換必須是轉換成封閉類型或從封閉類型轉換”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
在做類型隱式轉換的時候碰到這一報錯信息“用戶定義的轉換必須是轉換成封閉類型,或者從封閉類型轉換”:
聲明大致如下:
有2個類:A、B,其中類A和類B結構完全相同,只是類B屬于第三方;
在類C的某一個方法中需要返回一個List<A>,如:
public List<A> Func(){ List<B> list = new List<B>; ..... return list; }
這個時候因為返回類型不同而會報錯;
在類A中進行隱式轉換
class A{ .... public static implicit operator List<A>(List<B> value) { ... } ..... }
這個時候會報“用戶定義的轉換必須是轉換成封閉類型,或者從封閉類型轉換”的錯誤;
查閱MSDN,在類型轉換一節中有這么2句說明:
1.操作數必須是封閉類型
2.類A到類B的類型轉換定義不能在類C中進行(即2個類的轉換不能在第3個類中定義)
一開始一直認為是第一點的原因造成的編譯錯誤,也誤認為所謂的封閉類型,就一定要是類/結構,不能是集合對象,后來發現造成這一錯誤的原因是第二點,因為當我將類型轉換的定義更改為:
class A{ .... public static implicit operator A(List<B> value) { ... } ..... }
此時編譯通過,也就排除了第一點;
原來對于編譯器來說,class A是一個類型,List<A>也是一個類型,List<B>亦是一個類型,那么對于List<B>類型隱式轉換為List<A>類型的操作自然不能在class A中進行,符合第二點;
補充:
如果要在項目中,有方法:
public List<A> Func(){ List<B> list = new List<B>; ..... return list; }
非要讓這個list轉換成List<A>怎么做?
其實方法也很簡單,既然List<T>的隱式轉換不能做,那么在返回的時候將list中的元素逐個轉換即可:
隱式轉換定義:
class A{ .... public static implicit operator A(B value) { ... } ..... }
方法定義:
public List<A> Func(){ List<B> list = new List<B>; ..... return list.Select(p=>(B)p).ToList(); }
到此,關于“為什么用戶定義的轉換必須是轉換成封閉類型或從封閉類型轉換”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。