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
我认为 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