在做類型隱式轉換的時候碰到這一報錯信息“用戶定義的轉換必須是轉換成封閉類型,或者從封閉類型轉換”:
聲明大致如下:
有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();
}
謹以此獻給遇到相同問題,不解其因的朋友做參考。