溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

為什么用戶定義的轉(zhuǎn)換必須是轉(zhuǎn)換成封閉類型或從封閉類型轉(zhuǎn)換

發(fā)布時(shí)間:2021-10-12 11:17:21 來(lái)源:億速云 閱讀:144 作者:iii 欄目:編程語(yǔ)言

這篇文章主要介紹“為什么用戶定義的轉(zhuǎn)換必須是轉(zhuǎn)換成封閉類型或從封閉類型轉(zhuǎn)換”,在日常操作中,相信很多人在為什么用戶定義的轉(zhuǎn)換必須是轉(zhuǎn)換成封閉類型或從封閉類型轉(zhuǎn)換問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”為什么用戶定義的轉(zhuǎn)換必須是轉(zhuǎn)換成封閉類型或從封閉類型轉(zhuǎn)換”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

在做類型隱式轉(zhuǎn)換的時(shí)候碰到這一報(bào)錯(cuò)信息“用戶定義的轉(zhuǎn)換必須是轉(zhuǎn)換成封閉類型,或者從封閉類型轉(zhuǎn)換”:

聲明大致如下:

有2個(gè)類:A、B,其中類A和類B結(jié)構(gòu)完全相同,只是類B屬于第三方;

在類C的某一個(gè)方法中需要返回一個(gè)List<A>,如:

public List<A> Func(){
       List<B> list = new List<B>;
       .....       return list;
}

這個(gè)時(shí)候因?yàn)榉祷仡愋筒煌鴷?huì)報(bào)錯(cuò);

在類A中進(jìn)行隱式轉(zhuǎn)換

class A{
      ....      public static implicit operator List<A>(List<B> value)
      {
              ...
      }
      .....
}

這個(gè)時(shí)候會(huì)報(bào)“用戶定義的轉(zhuǎn)換必須是轉(zhuǎn)換成封閉類型,或者從封閉類型轉(zhuǎn)換”的錯(cuò)誤;
查閱MSDN,在類型轉(zhuǎn)換一節(jié)中有這么2句說(shuō)明:
1.操作數(shù)必須是封閉類型
2.類A到類B的類型轉(zhuǎn)換定義不能在類C中進(jìn)行(即2個(gè)類的轉(zhuǎn)換不能在第3個(gè)類中定義)
一開始一直認(rèn)為是第一點(diǎn)的原因造成的編譯錯(cuò)誤,也誤認(rèn)為所謂的封閉類型,就一定要是類/結(jié)構(gòu),不能是集合對(duì)象,后來(lái)發(fā)現(xiàn)造成這一錯(cuò)誤的原因是第二點(diǎn),因?yàn)楫?dāng)我將類型轉(zhuǎn)換的定義更改為:

class A{
      ....      public static implicit operator A(List<B> value)  {
              ...
      }
      .....
}


此時(shí)編譯通過,也就排除了第一點(diǎn);
原來(lái)對(duì)于編譯器來(lái)說(shuō),class A是一個(gè)類型,List<A>也是一個(gè)類型,List<B>亦是一個(gè)類型,那么對(duì)于List<B>類型隱式轉(zhuǎn)換為L(zhǎng)ist<A>類型的操作自然不能在class A中進(jìn)行,符合第二點(diǎn);


補(bǔ)充:
如果要在項(xiàng)目中,有方法:

public List<A> Func(){
       List<B> list = new List<B>;
       .....       return list;
}


非要讓這個(gè)list轉(zhuǎn)換成List<A>怎么做?
其實(shí)方法也很簡(jiǎn)單,既然List<T>的隱式轉(zhuǎn)換不能做,那么在返回的時(shí)候?qū)ist中的元素逐個(gè)轉(zhuǎn)換即可:
隱式轉(zhuǎn)換定義:

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();
}

到此,關(guān)于“為什么用戶定義的轉(zhuǎn)換必須是轉(zhuǎn)換成封閉類型或從封閉類型轉(zhuǎn)換”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI