Я не можу зрозуміти, чому наступний код C # не компілюється.
Як бачите, у мене є статичний загальний метод Щось із 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
ваш параметр типу оголошений загальний метод) не потрібно , щоб це зрозуміти (а List<T>
це IEnumerable<T>
).