为什么在这个通用代码中不允许隐式转换?
c#
在下面的 GetEnumerator() 实现中,即使 T 受 Shape 约束,编译器也拒绝转换List<T>.Enumerator为IEnumerator<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
接口协方差不适用于值类型。
记录在这里:
差异仅适用于引用类型;如果为变体类型参数指定值类型,则该类型参数对于生成的构造类型是不变的。