转换泛型列表时显式转换操作错误转换泛型列表时显式转换操作错误(explicit conversion

2019-05-12 10:12发布

我创建一个显式转换运营商的实体类型的泛型列表之间进行转换,以模型类型的泛型列表。 有谁知道为什么我收到以下错误:

用户定义的转换必须转换或从封闭类型

我已经有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;
    }

谢谢你的帮助。

Answer 1:

错误“用户定义的转换必须转换或从封闭型说:”究竟是什么意思。 如果你有一个转换操作符

class MyClass {
    public static explicit operator xxx(string s) { // details }
    public static implicit operator string(xxx x) { // details }
}

然后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;
}

问题是,这被定义为一个转换操作符必须驻留在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);
    }
}


Answer 2:

基本上,你不能做到这一点。 在您的运营商输入或输出类型必须声明运营商的类型。 一种选择可能是一个扩展方法,但说实话LINQ Select自带本身非常接近,一样List<T>.ConvertAll

作为扩展方法方法的一个例子:

public static class MyListUtils {
  public static List<Model.objA> ToModel(this List<Entity.objA> entities)
  {
    return entities.ConvertAll(entity => (Model.objA)entity);
  }
}

或者更一般地与LINQ Select

public static class MyListUtils {
  public static IEnumerable<Model.objA> ToModel(
     this IEnumerable<Entity.objA> entities)
  {
    return entities.Select(entity => (Model.objA)entity);
  }
}

而只使用someList.ToModel()



文章来源: explicit conversion operator error when converting generic lists