隐式转换:用户定义的转换必须是转换成封闭类型,或者从封闭类型转换
2013-04-16 09:55
489 查看
在做类型隐式转换的时候碰到这一报错信息“用户定义的转换必须是转换成封闭类型,或者从封闭类型转换”:
声明大致如下:
有2个类:A、B,其中类A和类B结构完全相同,只是类B属于第三方;
在类C的某一个方法中需要返回一个List<A>,如:
这个时候因为返回类型不同而会报错;
在类A中进行隐式转换
查阅MSDN,在类型转换一节中有这么2句说明:
1.操作数必须是封闭类型
2.类A到类B的类型转换定义不能在类C中进行(即2个类的转换不能在第3个类中定义)
一开始一直认为是第一点的原因造成的编译错误,也误认为所谓的封闭类型,就一定要是类/结构,不能是集合对象,后来发现造成这一错误的原因是第二点,因为当我将类型转换的定义更改为:
此时编译通过,也就排除了第一点;
原来对于编译器来说,class A是一个类型,List<A>也是一个类型,List<B>亦是一个类型,那么对于List<B>类型隐式转换为List<A>类型的操作自然不能在class A中进行,符合第二点;
补充:
如果要在项目中,有方法:
非要让这个list转换成List<A>怎么做?
其实方法也很简单,既然List<T>的隐式转换不能做,那么在返回的时候将list中的元素逐个转换即可:
隐式转换定义:
方法定义:
谨以此献给遇到相同问题,不解其因的朋友做参考。
声明大致如下:
有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(); }
谨以此献给遇到相同问题,不解其因的朋友做参考。
相关文章推荐
- explicit 关键字用于声明必须使用强制转换来调用的用户定义的类型转换运算符
- Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL
- C#高级编程四十一天----用户定义的数据类型转换
- 用户自定义类型的隐式转换
- C#高级编程四十一天----用户定义的数据类型转换
- using 语句中使用的类型必须可隐式转换为“System.IDisposable
- 认真CS丨用户定义的类型转换explicit、implicit & 运算符重载
- 混合类型的计算(mixed-type compution)或者隐式类型转换
- 为下面的函数原型编写函数定义: int ascii_to_integer(char *str); 这个字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数。如果字符串参数
- 在使用EF开发时候,遇到 using语句中使用的类型必须可隐式转换为System.IDisposE
- 用户定义的类型转换
- SQL中一些不经意隐式类型转换或者函数使用导致索引失效问题
- C#编程(四十一)----------用户定义的数据类型转换
- using 语句中使用的类型必须可隐式转换为“System.IDisposable“
- 【c语言】为下面的函数原型编写函数定义,这个字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数。
- c#之用户定义的数据类型转换
- c#之用户定义的数据类型转换介绍
- 【C语言】为下面的函数原型编写函数定义: int ascii_to_integer(char *str); 这个字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数。
- c#之用户定义的数据类型转换
- 在使用EF开发时候,遇到 using 语句中使用的类型必须可隐式转换为“System.IDisposable“ 这个问题。