我正在创建一个显式转换运算符,以在实体类型的通用列表与模型类型的通用列表之间进行转换。有谁知道为什么我收到以下错误:
用户定义的转换必须与封闭类型相互转换
我已经在 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;
}
谢谢你的帮助。
错误“用户定义的转换必须转换为封闭类型或从封闭类型转换”准确地说明了它的含义。如果您有转换运算符
class MyClass {
public static explicit operator xxx(string s) { // details }
public static implicit operator string(xxx x) { // details }
}
Then xxx
必须是MyClass
。这就是“转换必须与封闭类型相互转换”的含义。这里的封闭类型是MyClass
.
ECMA334 C# 规范的相关部分是 17.9.4:
转换运算符将源类型(由转换运算符的参数类型指示)转换为目标类型(由转换运算符的返回类型指示)。仅当以下所有条件均为 true 时,才允许类或结构声明从源类型 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;
}
问题是,要将此定义为转换运算符,它必须驻留在List<Model.objA>
or 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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)