В .NET 4 это должно поддерживаться, так как IEnumerable<T>
объявляется ковариантным, то есть объявление действительно IEnumerable<out T>
. В .NET 3.5 это не так, и вам придется использовать обходной путь, например
triangles.Cast<IShape>()
(Стоит отметить, что это была и эволюция языковых возможностей; то есть, если бы вы каким-то образом могли использовать C # 3 с .NET 4, он все равно не работал бы, потому что поддержка ко-и контравариантности не была добавлена к C # до версии 4 языка.)
Отличное объяснение ко- и контравариантности можно найти в книге Джона Скита C # в глубине , раздел 13.3.