Вы просто не можете разыграть тип от List<T1>
до List<T>
, даже если T1
расширяет T
.
Это по замыслу.
Предположим, что компилятор позволяет нам это делать, подумайте о следующем коде:
List<objects> models = new List<TestModel>(); // suppose we can do this
var o = new {a = 1 };
var index = models.IndexOf(o); // now we can invoke IndexOf(o)
На самом деле, models
здесь "указывает" на экземпляр List<TestModel>
, которыйозначает, что вызов models.IndexOf(o)
в конечном итоге вызовет метод List<TestModel>.IndexOf(TestModel o)
вместо List<object>.IndexOf(object o)
.(Аналогично polymorphism
).
List<object> .IndexOf(object o)
|
|
V
List<TestModel>.IndexOf(TestModel o)
Другими словами, вы предполагаете, что экземпляр o
(тип которого object
) можно преобразовать в TestModel
.Очевидно, это небезопасно.
См. Ковариация и Контравариантность в Обобщениях .
Как исправить
Просто используйте LINQ дляВ ролях:
List<object> collection = actionParameter
.Select( m => (object) m)
.ToList();