Я не могу понять, почему следующий код C # не компилируется.
Как видите, у меня есть статический универсальный метод Something с IEnumerable<T>
параметром (и T
он должен быть IA
интерфейсом), и этот параметр не может быть неявно преобразован в IEnumerable<IA>
.
Какое объяснение? (Я не ищу обходной путь, просто чтобы понять, почему это не работает).
public interface IA { }
public interface IB : IA { }
public class CIA : IA { }
public class CIAD : CIA { }
public class CIB : IB { }
public class CIBD : CIB { }
public static class Test
{
public static IList<T> Something<T>(IEnumerable<T> foo) where T : IA
{
var bar = foo.ToList();
// All those calls are legal
Something2(new List<IA>());
Something2(new List<IB>());
Something2(new List<CIA>());
Something2(new List<CIAD>());
Something2(new List<CIB>());
Something2(new List<CIBD>());
Something2(bar.Cast<IA>());
// This call is illegal
Something2(bar);
return bar;
}
private static void Something2(IEnumerable<IA> foo)
{
}
}
Ошибка, я попал в Something2(bar)
очередь:
Аргумент 1: невозможно преобразовать из System.Collections.Generic.List в System.Collections.Generic.IEnumerable.
T
ссылочными типами. Если вы используете это условие, where T: class, IA
оно должно работать. Связанный ответ содержит более подробную информацию.
Something2(foo);
прямо. Чтобы понять это, не нужно идти вокруг, .ToList()
чтобы получить List<T>
( T
это ваш параметр типа, объявленный универсальным методом) (a List<T>
- это IEnumerable<T>
).