为什么在这个通用代码中不允许隐式转换?

c#

在下面的 GetEnumerator() 实现中,即使 T 受 Shape 约束,编译器也拒绝转换List<T>.EnumeratorIEnumerator<Shape>。(1) 为什么会这样,(2) 是否有我忽略的解决方法?

using System.Collections.Generic;

interface Shape {
    void Draw();
}

class Picture<T> : IEnumerable<Shape> where T : Shape {  
List<T> shapes;
    public IEnumerator<Shape> GetEnumerator()
    {
        return shapes.GetEnumerator(); 
    }
}

回答

将约束从

where T : Shape

where T : class, Shape

接口协方差不适用于值类型。

记录在这里:

差异仅适用于引用类型;如果为变体类型参数指定值类型,则该类型参数对于生成的构造类型是不变的。


以上是为什么在这个通用代码中不允许隐式转换?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>