[英]Variance safety in 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 标准中看到
您是对的,这很可能是文档中的错误。
除了你的问题中的推理链,这是完全有道理的,我还有另一个(直观的)论点支持这是一个错误:
我们比较一下output-unsafe (A) 定义的最后两行:
- Xi 是协变或不变的,Ai 是输出不安全的。
- Xi 是逆变或不变的,Ai 是输入安全的。
加上input-unsafe (B) 定义的最后两行:
- Xi 是协变或不变的,Ai 是输入不安全的。
- Xi 是逆变或不变的,Ai 是输出不安全的。
输入和 output 安全性(以及协变和逆变)在 C# 中是对称的。 因此,这两个定义也应该是对称的,但它们不是:
A B
Line 1 "output-unsafe" "input-unsafe"
Line 2 "input-safe" "output-unsafe"
^
|
+--- strange outlier
您提出的更正也将解决该问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.