在 C# 中可以为类型参数添加方差注释,限制为值类型:
interface IFoo<in T> where T : struct
{
void Boo(T x);
}
如果方差注释在这种情况下完全没有意义,为什么编译器允许这样做?
最佳答案
Why this is allowed by compiler since variance annotation make completely no sense in a such situation?
这是编译器允许的,因为当我向 C# 4.0 编译器添加差异规则时,我什至从未考虑过有人可能会尝试这样做。
编译器警告和错误是特性,为了实现某个特性,至少必须在发布编译器之前的某个时刻考虑到它。我没有这样做,因此从来没有机会讨论是否应该对这种情况发出警告。
既然您已提请我注意,问题是:应该它是一项功能吗?编译器是否应该针对这种情况产生警告(或错误)?
这是一个判断电话。我们会考虑的一些事情是:
代码是不是有人可能会认为它做了一些明智的事情?人们希望不会;人们希望对类型系统有足够了解以制作接口(interface)变体的开发人员也知道变体仅适用于引用类型。但也许有些开发人员可能会认为它会起作用而输入它。至少这似乎并没有超出合理性。这不是明显的人为设计。
代码是否明显错误?是的,可能是。似乎不太可能有人故意要编写一个看起来不同但实际上不是的界面。
等等。
我得再考虑一下,但乍一看,这实际上可能是添加到编译器的一个不错的警告。我会与团队讨论,我们会考虑将其添加到 Roslyn 版本中。
谢谢你的想法!
关于类型参数的 C# 方差注释,限制为值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9353293/