例如IEnumerable<T>
接口:
public interface IEnumerable<out T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
在此接口中,泛型类型仅用作接口方法的返回类型,而不用作方法参数的类型,因此它可以是协变的。鉴于此,编译器不能从理论上推断出接口的差异吗?如果可以,为什么 C# 要求我们显式设置协/逆变关键字。
更新:正如 Jon Skeet 所提到的,这个问题可以归结为子问题:
编译器可以通过它在当前泛型类型及其所有基本类型中的使用方式来推断泛型类型的协/逆变吗?
例如..NET Framework 4.0 中有多少通用接口参数可以自动标记为协/逆变而没有任何歧义?大约 70%、80%、90% 或 100%?
如果可以,默认情况下是否应该对泛型类型应用协/逆变?至少对于那些能够从类型使用中分析和推断协方差的类型。