Der Compiler benötigt explizit IEnumerable<A> als IEnumerable<I> :
IEnumerable<A>
IEnumerable<I>
Aber mit generischen Einschränkungen erhalten wir:
Jedoch kompiliert das gut.
Daher die Frage: Ist das ein korrektes Verhalten, oder ist es ein Bug?
Das Problem ist, dass die generische Kovarianz nur für Referenztypen gilt. Zum Beispiel ist ein List<int> nicht * ein IEnumerable<Comparable> , sondern ein List<string> ist.
List<int>
IEnumerable<Comparable>
List<string>
Wenn Sie also T als Referenztyp festlegen, wird Folgendes kompiliert:
T
Das hat mit Kovarianz und Kontravarianz zu tun. Es genügt zu sagen, dass es kein Fehler ist, sondern ein Feature.
Für einen tieferen Einblick hier empfehle ich Eric Lipperts Blog-Post-Serie hier:
Ссылка
Tags und Links c# generics