请看这个简单的LINQPad示例:
void Main()
{
Foo<object> foo = new Foo<string>();
Console.WriteLine(foo.Get());
}
class Foo<out T>
{
public T Get()
{
return default(T);
}
}
编译时出现以下错误:
无效的变化修饰符,只有接口和委托类型参数可以指定为variant。
我不明白这段代码存在什么逻辑问题,所有内容都可以静态验证。为什么不允许这种情况发生?它会导致语言上的一些不一致性吗,还是因为CLR的限制而被认为太过昂贵难以实现?如果是后者,作为一个开发人员,我应该了解哪些关于这个限制的信息?
考虑到接口支持它,我原本期望类也能从逻辑上跟进。