【问题标题】:Why aren't classes in .NET 4 covariant? [duplicate]为什么 .NET 4 中的类不是协变的? [复制]
【发布时间】:2010-05-27 14:15:33
【问题描述】:

可能重复:
Why isn’t there generic variance for classes in C# 4.0?

作为一名新手程序员,我有几个关于 .NET 4 的变化的问题。与其说是它是如何工作的,不如说是为什么某些东西没有变化,以及其他人是否会觉得这很有用。

问题一:

我知道接口和委托在 .NET 4 中可以是协变/逆变的,但为什么不是类呢?所以,问题1:

List(of BaseClass) = List(of DerivedClass)

这是不安全的吗?这不是很有用吗?


问题 2:

问题 2 源自问题 1,但可能更多地处理签名而不是方差。假设我有一个带有 MustOverride 成员的 MustInherit 类:

Public MustInherit Class TestBase
    Public MustOverride Property SomeClass as BaseClass
End Class

在派生类中,为什么不能重写 SomeClass 并返回 BaseClass 的派生类?这不安全吗?只是签名不检查继承关系吗?

Public Class TestSpecific
    Inherits TestBase
    Public Overrides Property SomeClass as DerivedClass
End Class

任何关于为什么在 .NET 4 中不允许这样做的见解将不胜感激。

【问题讨论】:

  • 回答您的第二个问题(因为在我回答时问题已关闭):您可以通过向基类添加一些泛型来做到这一点。例如,Java 枚举使用它来确保 compareTo 只能传递该枚举的值。见herehere

标签: .net .net-4.0 covariance contravariance method-signature


【解决方案1】:

埃里克·利珀特answers the first part of you question here.

至于您问题的第二部分,C# 和 VB.NET 都要求返回类型协方差 - 但是相对于其他语言功能,它尚未得到足够高的优先级以使其进入任何版本。如果我没记错的话,这个功能还需要对 CLR 进行适当的更改。

至于为什么会这样,我将引导 Eric Lippert 片刻,并回答说不实现一个功能是免费的,而实现一个功能需要预算和时间来设计、开发、测试和记录它。 . 这不是免费的。一项功能必须对足够多的人具有足够的价值,才能证明创建它的费用是合理的。

【讨论】:

  • 谢谢,阅读他的帖子。我对为什么泛型参数不能有任何“可写”字段/属性感到困惑。有没有一个例子说明这会如何导致问题?回去进一步研究他的例子......
  • 我自己说得再好不过了。 :-)
  • @Casey:假设 C 在 T 中是协变的,并且 C 有一个方法 void M(T t)。你有一个 C 类型的变量 x。您将 C 类型的值转换为 C 并将其分配给 x。现在您可以调用 x.M(new Giraffe()) 因为就编译器所知,M 接受一个对象,而不是 Tiger。然后运行时在尝试将长颈鹿转换为老虎时崩溃。这就是为什么协变类型有一个“进入”的 T 是非法的。
猜你喜欢
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 2017-08-03
  • 1970-01-01
相关资源
最近更新 更多