首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#中的方差安全性

C#中的方差安全性
EN

Stack Overflow用户
提问于 2020-08-19 05:50:47
回答 2查看 161关注 0票数 3

我相信在C#文档的这一部分上有一个小错误!但我不确定。这真的是文档错误吗?还是我错了?

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/interfaces#variance-safety

而不是:

Xi是反变体或不变的,Ai是输入安全的。

它应该是:

Xi是逆反式或不变式,Ai是输入-不安全。

代码语言:javascript
复制
// 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!

我正在使用VisualStudio16.7.2,控制台应用程序(.Net框架) C# 7.3

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-19 15:25:07

这是C# 6草案标准(目前在learn.microsoft.com上发布)中的一个缺陷。它已被定为标准化进程的一部分。你可以在官方的C# 5.0标准中看到

票数 2
EN

Stack Overflow用户

发布于 2020-08-19 08:42:00

您是对的,这很可能是文档中的一个错误。

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

让我们比较输出定义的最后两行--不安全的 (A):

  • Xi是协变或不变的,Ai是输出的-不安全。
  • Xi是反变体或不变的,Ai是输入安全的。

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

  • Xi是协变或不变的,而Ai是输入不安全的。
  • Xi是逆反式或不变式,Ai是输出-不安全。

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

代码语言:javascript
复制
              A              B         
Line 1  "output-unsafe" "input-unsafe"
Line 2  "input-safe"    "output-unsafe"
               ^
               |
               +--- strange outlier

你的修正建议也能解决这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63480764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档