考虑以下类“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
我无法让这个工作。关于为什么这不起作用的解释是什么?
答案 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())