繁体   English   中英

C# 中的方差安全性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM