【问题标题】:Generics and Derived Classes .NET 3.5泛型和派生类 .NET 3.5
【发布时间】:2010-06-03 19:42:34
【问题描述】:

考虑“Circle”类继承自“Shape”的以下情况:

dim objListOfCircles as new List(of Circle)

DrawShapes(objListOfCirlces)


Private sub DrawShapes(byref objListOfShapes as List(of Shape))

for each objShape as Shape in objListOfShapes
  objShape.Draw()
next 

end sub

我无法让它工作。为什么这不起作用的解释是什么?

【问题讨论】:

    标签: generics .net-3.5 inheritance


    【解决方案1】:

    这称为协方差。很明显,派生对象(圆)的通用列表应该很容易转换为基本对象(形状)的通用列表,这是大多数人期望的工作,当它不起作用时会感到惊讶。

    但是,如果您已经对它们进行了任何反射工作,那么泛型并不像看起来那么简单,这会使代码复杂化。我敢肯定还有很多理论上的原因,甚至是实际的充分理由,为什么 NET v3.5 没有支持这一点

    但是,.NET 4.0 中添加了对协方差的支持:http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx

    在你升级到那个之前,你必须努力去做(在派生对象列表上执行 .ToArray() 将其馈送到基础对象列表的构造函数中,或类似的东西)

    【讨论】:

      【解决方案2】:

      你应该包括你的错误和哪一行得到它,但是...

      您必须手动投射它们。 3.5 不会自动转换这样的泛型。如何处理取决于您的要求。

      http://reddevnews.com/Articles/2009/05/01/Generic-Covariance-and-Contravariance-in-C-40.aspx?Page=2

      更好的是:http://msdn.microsoft.com/en-us/library/dd799517.aspx

      那篇文章解释了它。转到有关通用集合的部分。您问题的关键词是协变和逆变。

      不确定 VB,但在 C# 中,您可以执行我认为会转换为 DrawShapes(objListOfCircles.Cast(of Shape)().ToList()) 的操作

      【讨论】:

      • 伙计,有帮助的链接和代码示例的深思熟虑的回复,我得到了没有解释的叮当声?真的很烂。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 2012-09-08
      • 2019-04-15
      • 2014-06-19
      • 2011-10-09
      • 2010-10-22
      • 1970-01-01
      相关资源
      最近更新 更多