Невозможно передать IEnumerable <Triangle>в функцию, которая ищет IEnumerable <IShape> - PullRequest
2 голосов
/ 18 апреля 2011

У меня есть коллекция предметов:

 IEnumerable<Triangle>

Эти объекты поддерживают интерфейс IShape, но я получаю сообщение об ошибке, пытаясь передать это в функцию, которая запрашивает:

 IEnumerable<IShape>
  1. Почему я не могу передать это?
  2. Есть ли обходной путь для преобразования одного в другое, чтобы заставить это работать?

Ответы [ 2 ]

11 голосов
/ 18 апреля 2011

В .NET 4 это должно поддерживаться, так как IEnumerable<T> объявляется ковариантным, то есть объявление действительно IEnumerable<out T>. В .NET 3.5 это не так, и вам придется использовать обходной путь, например

triangles.Cast<IShape>()

(Стоит отметить, что это была и эволюция языковых возможностей; то есть, если бы вы каким-то образом могли использовать C # 3 с .NET 4, он все равно не работал бы, потому что поддержка ко-и контравариантности не была добавлена ​​к C # до версии 4 языка.)

Отличное объяснение ко- и контравариантности можно найти в книге Джона Скита C # в глубине , раздел 13.3.

0 голосов
/ 18 апреля 2011

Все просто:

IEnumerable<Triangle> не наследуется и не может быть присвоено IEnumerable<IShape>*

Между этими двумя типами нет такой связи. Звучит так, будто вы действительно хотите функцию, похожую на эту:

void MyFunction<T>(IEnumerable<T> items) where T : IShape

Там написано: «Дай мне функцию, которая принимает любые IEnumerable<T>, где Т наследуется от IShape». В качестве альтернативы вы можете использовать метод расширения .Cast<T>() (он удивительно эффективен).

* В вашей версии .Net Framework

...