Nie mogę zrozumieć, dlaczego nie można kompilować następującego kodu C #.
Jak widać, mam statyczną metodę ogólną Coś z IEnumerable<T>
parametrem (i T
jest ograniczone jako IA
interfejs), a tego parametru nie można niejawnie przekonwertować na IEnumerable<IA>
.
Jakie jest wyjaśnienie? (Nie szukam obejścia, tylko po to, aby zrozumieć, dlaczego to nie działa).
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)
{
}
}
Błąd w Something2(bar)
kolejce:
Argument 1: nie można konwertować z „System.Collections.Generic.List” na „System.Collections.Generic.IEnumerable”
T
do typów referencyjnych. Jeśli użyjesz tego warunku where T: class, IA
, powinno działać. Połączona odpowiedź zawiera więcej szczegółów.
Something2(foo);
wprost. Chodzenie po okolicy w .ToList()
celu uzyskania a List<T>
( T
jest to parametr typu zadeklarowany przez metodę ogólną) nie jest konieczne, aby to zrozumieć (a List<T>
jest IEnumerable<T>
).