Kei*_*ith 9 c# operator-overloading operators
我正在创建一个显式转换运算符,以将实体类型的通用列表转换为通用的模型类型列表.有谁知道我为什么会收到以下错误:
用户定义的转换必须转换为封闭类型或从封闭类型转换
我已经在Entity.objA和Model.objA之间有一个显式的转换运算符,它运行正常.尝试转换通用列表时出现问题.这甚至可能吗?
这是我的代码:
public static explicit operator List<Model.objA>(List<Entity.objA> entities)
{
List<Model.objA> objs= new List<Model.objA>();
foreach (Entity.objA entity in entities)
{
objs.Add((Model.objA)entity);
}
return claims;
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
jas*_*son 23
错误"用户定义的转换必须转换为封闭类型或从封闭类型转换"确切地说明它意味着什么.如果您有转换运算符
class MyClass {
public static explicit operator xxx(string s) { // details }
public static implicit operator string(xxx x) { // details }
}
Run Code Online (Sandbox Code Playgroud)
那xxx一定是MyClass.这就是"转换必须转换为封闭类型或从封闭类型转换"的含义.这里的封闭类型是MyClass.
ECMA334 C#规范的相关部分是17.9.4:
转换运算符从源类型(由转换运算符的参数类型指示)转换为目标类型,由转换运算符的返回类型指示.只有当以下所有条件都为真时,才允许类或结构声明从源类型S到目标类型T的转换,其中S0和T0是从删除尾部得到的类型?来自S和T的修饰符(如果有):
S0和T0是不同的类型.
S0或T0是发生运算符声明的类或结构类型.
S0和T0都不是接口类型.
排除用户定义的转换,从S到T或从T到S不存在转换.
所以这是你的代码:
public static explicit operator List<Model.objA>(List<Entity.objA> entities) {
List<Model.objA> objs= new List<Model.objA>();
foreach (Entity.objA entity in entities) {
objs.Add((Model.objA)entity);
}
return claims;
}
Run Code Online (Sandbox Code Playgroud)
问题是,要将其定义为转换运算符,它必须驻留在List<Model.objA>或List<Entity.objA>类中,但当然您不能这样做,因为您无权更改这些类型.
您可以使用Enumerable.Select投影到其他类型,或List<T>.ConvertAll.例如:
public static class ListExtensions {
public static List<Model.objA> ConvertToModel(this List<Entity.objA> entities) {
return entities.ConvertAll(e => (Model.objA)e);
}
}
Run Code Online (Sandbox Code Playgroud)