Einen generischen Elementtyp nach unten werfen

7
%Vor%

return confControl; löst eine Ausnahme aus:

  

Der Typ ConfigControlBase<ProviderX> kann nicht implizit in ConfigControlBase<ProviderBase>

konvertiert werden
    
Rookian 07.02.2011, 16:48
quelle

5 Antworten

21

Lassen Sie uns den Namen Ihrer Klassen und Eigenschaften ändern, behalten Sie aber die gleiche Form:

%Vor%

Jetzt ist klar, warum das nicht legal ist? Angenommen, es wäre legal. Dann könntest du das tun:

%Vor%

Und jetzt hast du einen Tiger in deinem Aquarium. Und niemand will das.

Der Compiler (oder die Laufzeit) muss diesen Typfehler irgendwie verhindern; Es entscheidet sich, es so schnell wie möglich zu verhindern. Die früheste Möglichkeit dafür ist der Typentest für die Konvertierung von Aquarium nach Cage<Animal> . Der Compiler weiß, dass dies in Aquarien schließlich zu Tigern führen kann, so dass die Umwandlung überhaupt nicht möglich ist. Wenn Sie den Compiler zwingen, es durch Umwandlungen zuzulassen, schlägt es zur Laufzeit fehl.

    
Eric Lippert 07.02.2011, 17:32
quelle
8

Generische Typen mit zuweisbaren Typargumenten können nicht selbst zugewiesen werden.
Zum Beispiel können Sie List<string> nicht auf List<object> anwenden, obwohl string ein object ist.

Es ist nicht sofort offensichtlich, warum solch ein Casting nicht unterstützt wird. Lassen Sie mich Ihnen ein Beispiel geben:

%Vor%

C # unterstützt keine Universumsexplosion, aber seit C # 4.0 ist eine Light-Version dieser Idee implementiert. Sie sehen, in einigen Fällen wäre ein solches Casting tatsächlich sicher.

.NET 4.0 enthält Konzepte der Kovarianz und Kontravarianz in Generics nur für Interfaces und Delegaten . Sie können dies überprüfen.

Beispiel (funktioniert nicht vor .NET 4.0):

%Vor%     
Dan Abramov 07.02.2011 17:21
quelle
1

Dies liegt daran, dass ConfigControlBase<ProviderX> nicht ConfigControlBase<ProviderBase>

ist     
Itay Karo 07.02.2011 16:50
quelle
0

dein

%Vor%

stimmt nicht mit

überein %Vor%     
Fredou 07.02.2011 16:52
quelle
0

Diese Antwort ist in Ihrem Szenario möglicherweise nicht hilfreich, da Sie wahrscheinlich nach einer anderen Lösung suchen sollten, aber während der Reflektion fand ich die Fähigkeit, weniger generische Typen zu verwenden , daher habe ich eine Lösung geschrieben dafür. Es funktioniert jedoch nur für Schnittstellen, und Sie müssen sicherstellen, dass Sie nur Objekte des richtigen Typs an die Schnittstelle übergeben.

Im Grunde erzeuge ich zur Laufzeit eine Proxy-Klasse , die alle erforderlichen Umwandlungen für Sie durchführt. Die Verwendung sieht wie folgt aus:

%Vor%

Weitere Informationen und den Quellcode finden Sie auf meinem Blog >.

    
Steven Jeuris 02.07.2011 00:39
quelle