【问题标题】:Implicit conversion of collections集合的隐式转换
【发布时间】:2011-04-04 23:34:11
【问题描述】:

如果我在两种类型之间定义一个显式转换运算符,难道不应该遵循我可以在这些类型的集合之间显式转换吗?即。

    public static explicit operator FooEntity(Entity entity)
    {
        FooEntity e = new FooEntity(entity);
        return e; 
    }

因此我可以做到这一点,

    IEnumerable<Entity> entities = GetEntities();
    IEnumerable<FooEntity> fooEntities = (IEnumerable<FooEntity>)entities;

    IEnumerable<FooEntity> fooEntities = entities as IEnumerable<FooEntity>

这是否可能以某种方式实现,或者我是否还必须创建自己的运算符才能在集合之间进行转换?我收到一个运行时错误,提示无法进行转换。

谢谢。

【问题讨论】:

    标签: c# operator-overloading ienumerable


    【解决方案1】:

    C# 不支持这种在集合分配上泛型类型变化的方法,您必须使用类似的方法:

    IEnumerable<FooEntity> fooEntities = entities.Select(e => (FooEntity)e);
    

    【讨论】:

    • 我是否必须重载 Cast?因为我尝试在 Entity 和 FooEntity 之间使用隐式(而不是显式)运算符,但仍然出现运行时错误,说无法从 Entity 转换为 FooEntity。
    • 不,如果您为集合中的项目类型创建了显式强制转换重载,那么这就是您所需要的。
    • 哇,原来你是对的——我的错。我刚刚进行了快速测试,看来您必须改用 Select()
    • 补充答案:要在 C# 4.0 中使用协变(或逆变),必须在两种类型之间进行 表示保留 转换。如果您希望在集合中的每个元素上运行一些代码来转换它,您将不得不编写该代码。编译器不知道怎么给你写。
    猜你喜欢
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 2014-08-28
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    相关资源
    最近更新 更多