Технический термин для этого заключается в том, что дженерики инвариантны в C # 3.0 и более ранних версиях. Начиная с C # 4.0, актерский состав работает.
Что означает инвариант, так это то, что между двумя универсальными типами нет связи только потому, что их универсальный тип параметры связаны (то есть являются подтипами или супертипами друг друга).
В вашем примере нет никакой типизации между IEnumerable<object>
и IEnumerable<string>
, просто потому что строка является подтипом объекта. Их просто считают двумя совершенно не связанными типами, такими как string и int (они все еще оба являются подтипами объекта, но все есть)
Существует несколько обходных путей и исключений для этой проблемы, с которой вы столкнулись.
Во-первых, вы можете привести каждую строку отдельно к объекту, если вы используете .NET 3.0, вы можете сделать это, используя метод расширения Cast<T>()
. В противном случае вы можете использовать foreach и поместить результат в новую переменную нужного вам статического типа.
Во-вторых, массивы являются исключением для ссылочного типа, т. Е. Передача в виде типа string [] методу, принимающему типы объектов [], должна работать.