转换通用列表时显式转换运算符错误

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)