如何解决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 举报,一经查实,本站将立刻删除。