程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 隱式轉換:用戶定義的轉換必須是轉換成封閉類型,或者從封閉類型轉換

隱式轉換:用戶定義的轉換必須是轉換成封閉類型,或者從封閉類型轉換

編輯:C++入門知識

在做類型隱式轉換的時候碰到這一報錯信息“用戶定義的轉換必須是轉換成封閉類型,或者從封閉類型轉換”:

聲明大致如下:

有2個類:A、B,其中類A和類B結構完全相同,只是類B屬於第三方;

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


[csharp]
public List<A> Func() 

       List<B> list = new List<B>; 
       ..... 
       return list; 

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


這個時候因為返回類型不同而會報錯;

在類A中進行隱式轉換


[csharp]
class A 

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

class A
{
      ....
      public static implicit operator List<A>(List<B> value)
      {
              ...
      }
      .....
}這個時候會報“用戶定義的轉換必須是轉換成封閉類型,或者從封閉類型轉換”的錯誤;
查閱MSDN,在類型轉換一節中有這麼2句說明:
1.操作數必須是封閉類型
2.類A到類B的類型轉換定義不能在類C中進行(即2個類的轉換不能在第3個類中定義)
一開始一直認為是第一點的原因造成的編譯錯誤,也誤認為所謂的封閉類型,就一定要是類/結構,不能是集合對象,後來發現造成這一錯誤的原因是第二點,因為當我將類型轉換的定義更改為:


[csharp]
class A 

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

class A
{
      ....
      public static implicit operator A(List<B> value)
      {
              ...
      }
      .....
}
此時編譯通過,也就排除了第一點;
原來對於編譯器來說,class A是一個類型,List<A>也是一個類型,List<B>亦是一個類型,那麼對於List<B>類型隱式轉換為List<A>類型的操作自然不能在class A中進行,符合第二點;


補充:
如果要在項目中,有方法:


[csharp]
public List<A> Func() 

       List<B> list = new List<B>; 
       ..... 
       return list; 

public List<A> Func()
{
       List<B> list = new List<B>;
       .....
       return list;
}
非要讓這個list轉換成List<A>怎麼做?
其實方法也很簡單,既然List<T>的隱式轉換不能做,那麼在返回的時候將list中的元素逐個轉換即可:
隱式轉換定義:

 

[csharp]
class A 

      .... 
      public static implicit operator A(B value) 
      { 
              ... 
      } 
      ..... 

class A
{
      ....
      public static implicit operator A(B value)
      {
              ...
      }
      .....
}
方法定義:

 

[csharp]
public List<A> Func() 

       List<B> list = new List<B>; 
       ..... 
       return list.Select(p=>(B)p).ToList(); 

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


謹以此獻給遇到相同問題,不解其因的朋友做參考。

 

 

 

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved