Если я реализую интерфейс для типа значения и пытаюсь применить его к типу интерфейса этого списка, почему это приводит к ошибке, тогда как ссылочный тип преобразует только штраф?
Это ошибка:
Невозможно преобразовать тип аргумента экземпляра
System.Collections.Generic.List<MyValueType>
доSystem.Collections.Generic.IEnumerable<MyInterfaceType>
Мне нужно явно использовать метод Cast<T>
для его преобразования, почему?
Поскольку IEnumerable
представляет собой перечисление только для чтения через коллекцию, для меня не имеет никакого смысла, что он не может быть передан напрямую.
Вот пример кода для демонстрации проблемы:
public interface I{}
public class T : I{}
public struct V: I{}
public void test()
{
var listT = new List<T>();
var listV = new List<V>();
var listIT = listT.ToList<I>(); //OK
var listIV = listV.ToList<I>(); //FAILS to compile, why?
var listIV2 = listV.Cast<I>().ToList(); //OK
}