在下面的代码中,我希望能够从elements
to隐式转换,baseElements
因为TBase
它可以隐式转换为IBase
.
public interface IBase { }
public interface IDerived : IBase { }
public class VarianceBug
{
public void Foo<TBase>() where TBase : IBase
{
IEnumerable<TBase> elements = null;
IEnumerable<IDerived> derivedElements = null;
IEnumerable<IBase> baseElements;
// works fine
baseElements = derivedElements;
// error CS0266: Cannot implicitly convert type
// 'System.Collections.Generic.IEnumerable<TBase>' to
// 'System.Collections.Generic.IEnumerable<IBase>'.
// An explicit conversion exists (are you missing a cast?)
baseElements = elements;
}
}
但是,我收到评论中提到的错误。
引用规范:
如果是使用变体类型参数声明的接口或委托类型,并且对于每个变体类型参数,则类型可以变型
T<A1, …, An>
转换为类型,并且以下内容之一成立:T<B1, …, Bn>
T
T<X1, …, Xn>
Xi
Xi
是协变的,并且存在从Ai
到的隐式引用或身份转换Bi
Xi
是逆变的,并且存在从Bi
到的隐式引用或身份转换Ai
Xi
是不变的,并且存在从Ai
到的身份转换Bi
检查我的代码,它似乎与规范一致:
IEnumerable<out T>
是一个接口类型IEnumerable<out T>
用变体类型参数声明T
是协变的TBase
从到存在隐式引用转换IBase
那么 - 这是 C# 4 编译器中的错误吗?