当前位置:编程学习 > 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();
}


谨以此献给遇到相同问题,不解其因的朋友做参考。

 

 

 

 

 

 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,