Ich kann nicht verstehen, warum der folgende C # -Code nicht kompiliert wird.
Wie Sie sehen können, habe ich eine statische generische Methode Etwas mit einem IEnumerable<T>
Parameter (und T
ist darauf beschränkt, eine IA
Schnittstelle zu sein), und dieser Parameter kann nicht implizit in konvertiert werden IEnumerable<IA>
.
Was ist die Erklärung? (Ich suche nicht nach einer Problemumgehung, nur um zu verstehen, warum es nicht funktioniert).
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)
{
}
}
Fehler, den ich in der Something2(bar)
Schlange bekomme :
Argument 1: Konvertierung von 'System.Collections.Generic.List' in 'System.Collections.Generic.IEnumerable' nicht möglich
T
auf Referenztypen beschränkt . Wenn Sie die Bedingung verwenden where T: class, IA
, sollte es funktionieren. Die verknüpfte Antwort enthält weitere Details.
Something2(foo);
direkt sagen . Um dies zu verstehen, ist es nicht erforderlich .ToList()
, a zu ermitteln List<T>
( T
ist Ihr Typparameter, der von der generischen Methode deklariert wurde) (a List<T>
ist ein IEnumerable<T>
).