3

Folgendes Snippet wird nicht kompiliert. Mit folgenden Fehler:C#: Keine Implikaturkonvertierung von Klasse <Child> in Klasse <Base>

Cannot implicitly convert type 'Container<ChildClass>' to 'Container<BaseClass>'

class BaseClass {} 
class ChildClass : BaseClass {} 
class Container<T> where T : BaseClass {} 
class Program { 
    static void Main() { 
     // why doesn't this work? 
     Container<BaseClass> obj = new Container<ChildClass>(); 
    } 
} 

Ist das von Design? Wenn es ist, was ist der Grund?

+3

Dieses Problem tritt erwartungsgemäß einmal pro Woche auf. –

+1

... und dann sagt Marc Gravell vorhersehbar, dass die Unterstützung für Covarianz in C# 4 begrenzt ist: –

+1

Nun, es ist * begrenzt! Ich bin es leid zu lesen, aber es wird in C# 4.0 funktionieren, was einfach nicht stimmt ... (für Listen, zumindest) –

Antwort

14

(aus dem Wiki, bei dups)

C# (3,0) nicht Kovarianz von Listen usw. C# 4.0 unterstützt unterstützen begrenzt [co | contra ] Varianz, aber still not lists.

Das Problem ist, dass mit:

Container<BaseClass> obj = new Container<ChildClass>(); 

ich tun konnte:

obj.Add(new SomeOtherSubclass()); // SomeOtherSubclass : BaseClass 

die kompilieren würde, aber nicht funktionieren.

Dieses Verhalten ist unterstützt für Arrays, aber weitgehend aus historischen Gründen.

+0

Ein Freund von mir beschwerte sich über den Mangel an Kovarianz wie vor einem Jahr, als Generika zum ersten Mal herauskam. Ich hatte keine Ahnung, wovon er redete. Dann habe ich versucht, das oben genannte zu tun ... Ich sollte öfter auf ihn hören. – Min

4

Yo,

Wenn Sie den Killer Artikel auf Kovarianz/Kontra auf C# wollen, den Lippert Blog eric Check-out, "fabelhafte Abenteuer bei der Codierung". Erstens, das ist mein favortie Blog Name und zweiter eric die beste Folge von Artikeln zu (co | contra) schrieb Varianz:

http://blogs.msdn.com/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part-one.aspx

Dies so gut wie Breaking Bad ist.

+0

+1 für Breaking Bad: p – Alex

+0

Ich nehme dieses zurück und tausche es dafür: das ist so gut wie schlecht brechen, Staffel 1. – Roubachof

0

Cannot implicitly convert type Container<ChildClass> to Container<BaseClass>

Es ist eine sehr häufige Fehlauffassung, dass MyClass<Child> erbt von MyClass<Base>.