类型参数的 C# 方差注释,限制为值类型

标签 c# generics compiler-construction covariance contravariance

在 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/

相关文章:

c# - 使用 NEST 从何处获取 ElasticSearch 文档版本

c# - 带有点符号的 Linq - 哪种形式更好或者这两者之间有什么区别?

c# - 将字符串转换为 IEnumerable<object>

objective-c - 在 Swift 中声明具有泛型类型的变量

objective-c - Objective-C : Inline function - symbol not found

c# - 数据绑定(bind) Run 的 Text 属性

C# API POST 请求

c# - 方法 <ClassName> 是什么意思?

汇编中的 C++ 类函数

compiler-construction - 如何管理编译器生成的代码中使用的堆栈?