泛型和派生类.NET 3.5

时间:2010-06-03 19:42:34

标签: generics .net-3.5 inheritance

考虑以下类“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

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

2 个答案:

答案 0 :(得分:3)

这称为协方差。很明显,派生对象(圆圈)的通用列表应该可以轻松地转换为基础对象(形状)的通用列表,这是大多数人期望工作的东西,并且当它没有时会感到惊讶。

但是,如果你们每次都使用它们进行任何反射工作,那么泛型并不像它们看起来那么简单,这使得代码变得复杂。我确信还有很多理论上的原因,甚至是实际的理由,为什么没有通过NET v3.5支持这个原因

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

在升级到那之前,你必须以艰难的方式去做(在派生对象列表中执行一个.ToArray()到基础对象列表的构造函数中,或类似的东西)

答案 1 :(得分:1)

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

您必须手动投射它们。 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(objListOfCirlces.Cast(of Shape)()。ToList())