微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#中的方差安全

如何解决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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。