C#中的方差安全

问题描述

我相信C#文档的这一部分存在一些错误!但是我不确定。确实是文档错误吗?还是我错了?
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/interfaces#variance-safety

代替:

Xi是不变的或不变的,而Ai是输入安全的。

应为:

Xi是不变的或不变的,而Ai是输入不安全的。

// test code 1
interface I1<out T>{ // T is covariant -> input-UNsafe

    I2<T> test1(); // error,I2<T> is output-unsafe! which proves my point
}
interface I2<in P> { } // P is contravariant!

我正在使用Visual Studio 16.7.2,控制台应用程序(.Net Framework)C#7.3

解决方法

这是C#6草案标准(当前在docs.microsoft.com上发布)中的错误。它已作为标准化过程的一部分进行了修复。您可以在官方C# 5.0 Standard

中看到 ,

您是对的,很可能是文档中的错误。

除了您的问题中的推理链非常合理之外,我还有另一个(直观的)论点支持这种错误:

让我们比较 output-unsafe (A)定义的最后两行:

  • Xi是协变或不变的,而Ai是输出不安全的。
  • Xi是不变的或不变的,而Ai是输入安全的。

带有 input-unsafe 的定义的最后两行(B):

  • Xi是协变或不变的,而Ai是输入不安全的。
  • Xi是不变的或不变的,而Ai是输出不安全的。

在C#中,输入和输出安全性(以及协方差和协方差)是对称的。因此,这两个定义也应该是对称的,但不是:

              A              B         
Line 1  "output-unsafe" "input-unsafe"
Line 2  "input-safe"    "output-unsafe"
               ^
               |
               +--- strange outlier

您提出的更正也将解决此问题。