C# 中的变体安全

Variance safety in C#

我认为 C# 文档的这一部分有一点错误!但我不确定。这真的是文档错误吗?或者我错了吗?
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/interfaces#variance-safety

而不是:

Xi is contravariant or invariant and Ai is input-safe.

应该是:

Xi is contravariant or invariant and Ai is input-UNsafe.

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

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

除了你问题中的推理链,这完全有道理,我还有另一个(直观的)论点支持这是一个错误:

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

  • Xi is covariant or invariant and Ai is output-unsafe.
  • Xi is contravariant or invariant and Ai is input-safe.

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

  • Xi is covariant or invariant and Ai is input-unsafe.
  • Xi is contravariant or invariant and Ai is output-unsafe.

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

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

您提出的更正也会解决这个问题。

这是 C# 6 标准草案(目前发布于 docs.microsoft.com)中的错误。它已作为标准化过程的一部分得到修复。可以在官方看到C# 5.0 Standard