2017-12-28 9 views
0

Wenn ich einen Subtyps zu einem Supertyp Referenz zuweisen (Upcasting):Conditional Operator Zuordnung

IWService wService; 
wService = new WService(); 
wService = new WServiceStub(); 

Warum kann ich ? : sie in einem Bedingungsoperator nicht zuordnen?

IWService wService = isStub ? new WServiceStub() : new WService(); 

ich diesen Fehler:

Type of conditional expression cannot be determined because there is no implicit conversion between MyNamespace.WServiceStub and MyNamespace.WService

Aber es ist genug, um einen von ihnen zu dem Supertyp zu werfen zu kompilieren:

IWService wService = isStub ? (IWService)new WServiceStub() : new WService(); 

oder

IWService wService = isStub ? new WServiceStub() : (IWService)new WService(); 

I don Verstehe nicht, warum ich eine explizite Besetzung brauche, wenn ich nie ge t InvalidCastException. Die Konvertierung ist immer sicher, oder?

Ist der folgende Code nicht genau derselbe?

IWService wService; 
if (isStub) 
{ 
    wService = new WServiceStub(); 
} 
else 
{ 
    wService = new WService(); 
} 
+1

Wenn WService und WServiceStub IDisposable sowie IWService implementieren, welchen Typ sollte der Ausdruck 'isStub? new WServiceStub(): new WService() 'have? – Heinzi

Antwort

-1

Es ist, weil der Typ des dritten Operanden muss den Typen der zweiten konvertierbar sein, es nicht auf der linken Seite der Zuweisung sieht bei dem Ergebnistyp des Ausdrucks zu bestimmen.

+0

Das ist nicht ganz richtig. Der zweite kann auch in den Typ des dritten umwandelbar sein. Siehe https://stackoverflow.com/a/18260915/860585 – Rotem

Verwandte Themen