2016-11-02 2 views
-2

Ich habe den folgenden Code mit dem expliziten Guss a = (Class2)oImplizite gossenen Referenztyp

using System; 

class Class1 { } 
class Class2 : Class1{ } 

class IsTest 
{ 
    static void Test(object o) 
    { 
     Class1 a; 
     Class2 b; 

     if (o is Class2) 
     { 
      Console.WriteLine("o is Class2"); 
      a = (Class2)o; // Works 
      a = o; // **implicit cast won't work - error CS0266** 
     } 
    } 
    static void Main() 
    { 
     Class1 c1 = new Class1(); 
     Class2 c2 = new Class2();   
     Test(c2); 
    } 
} 

Als ich implizite Umwandlung versucht, bin a = o es mir den Fehler CS0266 gibt. Von dem, was ich weiß, ist das Konvertieren eines Referenztyps in eine direkte oder indirekte Vorgängerklasse eine Erweiterung, so dass ein Programm die Konvertierung implizit durchführen kann.

b ist von a abgeleitet, also warum die implizite Umwandlung nicht funktioniert?

+0

http://ideone.com/5FH8bt - es funktioniert – zerkms

+0

Ja, es funktioniert mit der ausdrücklichen Wirf a = (Class2) o, aber nicht mit dem impliziten a = o. – k1gabi

+0

mit System; Klasse Class1 {} Klasse Class2: Class1 {} Klasse IsTest { static void Test (Objekt o) { Class1 a; Klasse2 b; if (o ist Class2) { Console.WriteLine ("o ist Class2"); a = o; // implizite Umwandlung wird nicht funktionieren - Fehler CS0266 } } static void Main() { Class1 c1 = new Class1(); Klasse2 c2 = neue Klasse2(); Test (c2); } } } – k1gabi

Antwort

3

Es ist gemäß der C# Standard:

So Umwandlung Betreiber von nicht erlaubt zu konvertieren oder zu widersprechen, weil implizite und explizite Konvertierungen bereits zwischen Objekt und alle anderen Arten existieren.

https://msdn.microsoft.com/en-us/library/aa664464(v=vs.71).aspx

Zusätzlich zu sehen, dass alle möglichen impliziten Konvertierungen definiert in 13.1.4 Implicit reference conversions am http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf

+0

Die Antwort bezieht sich auf benutzerdefinierte Konvertierungsoperatoren ... Während OP anscheinend versucht, implizit auf Basistyp zu basieren. –

+0

@AlexeiLevenkov die zweite Hälfte handelt von impliziten Konvertierungen. – zerkms