C # Casting GenericB zu GenericA wo B: A

8

Ich habe zwei Klassen, MyClassA und MyClassB. MyClassB erbt von MyClassA. Ich habe eine Methode mit folgender Signatur geschrieben:

%Vor%

Ich habe auch den folgenden Event-Handler.

%Vor%

Ich verstehe, dass MyGeneric<MyClassA> nicht vom selben Typ MyGeneric<MyClassB> ist, aber da MyClassB eine Unterklasse von MyClassA ist, gibt es noch eine Möglichkeit, dies zu erreichen?

Als Referenz die genaue Fehlermeldung:

  

Das Objekt des Typs kann nicht umgewandelt werden   'MSUA.GraphViewer.GraphControls.TreeNode 1[MSUA.GraphViewer.GraphControls.MaterialConfigControl]' to type 'MSUA.GraphViewer.GraphControls.TreeNode 1 [MSUA.GraphViewer.PopulatableControl]'.

    
Roy T. 15.07.2011, 12:20
quelle

3 Antworten

7

Dies ist Kontravarianz Typ in Generika.

Obwohl B ein Untertyp von A ist, ist
Generic<B> kein Untertyp von Generic<A> ,
Daher kannst du Generic<B> nicht auf Generic<A> anwenden.

Überprüfen Sie Ссылка für weitere Details.

Sie können DoSomething() auf DoSomething(Generic<B>) überladen, diese Methode kann dann Generic<B> in Generic<A> konvertieren und DoSomething(Generic<A>) aufrufen.

    
StuperUser 15.07.2011, 12:24
quelle
5

Wenn Ihre generische Klasse MyGeneric<T> eine interface implementieren kann, die kovariant in T ist, dann könnten Sie Folgendes tun:

  1. Definieren Sie eine Interface-Kovariante in T :

    %Vor%

    Dies bedeutet, dass der generische Typ T nur ein Ausgabetyp sein kann (darf nicht Teil einer in der Schnittstelle definierten Methodensignatur sein.)

  2. Machen Sie Ihre Klasse MyGeneric<T> implementieren IMyGeneric<out T> .

  3. Nun ist durch den interface , der in T kovariant ist, der folgende Code gültig:

    %Vor%

    In deinem Fall könntest du Folgendes schreiben:

    %Vor%

BEARBEITEN : Lies einfach in den Kommentaren, dass du mit .NET 3.5 arbeitest, leider funktioniert das in deinem Fall nicht. Ich werde die Antwort hinterlassen, für den Fall, dass es jemand anderem nutzt. Entschuldigung, ich habe diese wichtige Information verpasst.

    
InBetween 15.07.2011 13:02
quelle
1

Most Einige generische Klassen haben einen Cast & lt; T & gt; Funktion, die es für Sie tut. Wenn es nicht existiert, könnten Sie versuchen, Ihre eigenen zu erstellen.

    
hcb 15.07.2011 12:26
quelle

Tags und Links