转换泛型列表时显式转换运算符错误

2023-12-24

我正在创建一个显式转换运算符,以在实体类型的通用列表与模型类型的通用列表之间进行转换。有谁知道为什么我收到以下错误:

用户定义的转换必须与封闭类型相互转换

我已经在 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(使用前将#替换为@)

转换泛型列表时显式转换运算符错误 的相关文章

随机推荐