Дженерики и производные классы .NET 3.5 - PullRequest
0 голосов
/ 03 июня 2010

Рассмотрим следующее, где класс "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 ]

3 голосов
/ 03 июня 2010

Это называется ковариацией. Кажется очевидным, что общий список производных объектов (окружностей) должен легко преобразовываться в общий список базовых объектов (фигур), это то, что большинство людей ожидают от работы, и удивляются, когда этого не происходит.

Однако, если вы когда-либо работали с ними над отражением, обобщения не так просты, как кажутся, что усложняет код для этого. Я уверен, что есть также много теоретических или даже веских причин, почему это не было поддержано через NET v3.5

Но в .NET 4.0 добавлена ​​поддержка ковариации: http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx

До тех пор, пока вы не обновитесь до этого, вам придется делать это сложным способом (выполните .ToArray () в производном списке объектов, передайте его в конструктор списка базовых объектов или что-то подобное)

1 голос
/ 03 июня 2010

Вы должны указать свою ошибку и узнать, какая строка ее получает, но ...

Вы должны разыграть их вручную. 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 ())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...