C#类型参数的方差注释,被约束为值类型

本文关键字:约束 类型 类型参数 方差 注释 | 更新日期: 2023-09-27 18:25:12

在C#中,可以将方差注释添加到类型参数中,限制为值类型:

interface IFoo<in T> where T : struct
{
  void Boo(T x);
}

如果方差注释在这种情况下完全没有意义,为什么编译器允许这样做?

C#类型参数的方差注释,被约束为值类型

既然方差注释在这种情况下完全没有意义,为什么编译器允许这样做?

这是编译器允许的,因为当我将方差规则添加到C#4.0编译器中时,我甚至从未考虑过有人可能会尝试这样做。

编译器警告和错误是功能,为了实现一个功能,在交付编译器之前,至少必须考虑。我没有这样做,因此从来没有机会辩论是否应该对这种情况发出警告。

既然你已经引起了我的注意,问题是:它应该是一个功能吗?编译器是否应该为这种情况生成警告(或错误)?

这是一个判断。我们会考虑的一些事情是:

  • 代码是不是有人可能会认为它做了一些合理的事情而键入的那种东西?希望不会;人们希望对类型系统有足够了解以制作接口变体的开发人员也知道variation只适用于引用类型。但也许有一些开发人员可能会输入这个,以为它会起作用。这似乎至少没有超出合理性。这显然不是人为的。

  • 代码是否明显错误?是的,很可能是这样。似乎不太可能有人故意想写一个看起来变体但实际上不是的界面。

等等。

我得多考虑一下,但乍一看,这实际上可能是一个不错的警告,可以添加到编译器中。我会和团队讨论,我们会考虑将其添加到Roslyn版本中。

谢谢你的想法!

它之所以被允许,仅仅是因为它是合法代码。这绝对没有害处。是的,你不能使用逆变转换,但我看不出有什么问题。代码中的任何内容实际上都不会误导或隐藏一些扭曲的

我只是认为编译器在检查方差有效性时不会检查T值类型还是引用类型类型这样做是毫无意义的,而且在任何情况下都没有副作用。