2013-02-08 8 views
6

mit dem folgenden Code:Umrechnungsregeln für überlastet Umwandlung Betreiber

using System; 

namespace Test721 
{ 
    class MainClass 
    { 
     public static void Main(string[] args) 
     { 
      Console.WriteLine(new A()); //prints 666 
      Console.WriteLine(new B()); //prints 666 
      Console.ReadLine(); 
     } 
    } 

    public class A 
    { 
     public static implicit operator int(A a) 
     { 
      return 666; 
     } 
    } 

    public class B : A 
    { 
     public static implicit operator double(B b) 
     { 
      return 667; 
     } 
    } 
} 

die Ergebnisse sind wie in den Kommentaren - beide Linien drucken 666.

I Console.WriteLine(new B()); 667 zu schreiben erwarten würde, während es a double Überlastung von .

Warum passiert das?

Antwort

7

Diese in Abschnitt bedeckt ist 7.4.3.4 des 3,5 C# Sprachspezifikation Dieser Abschnitt befasst sich mit der Überladungsauflösung und der Berücksichtigung von Konvertierungen in diesem Prozess. Die anwendbare Zeile lautet

Wenn eine implizite Konvertierung von T1 nach T2 existiert und keine implizite Konvertierung von T2 in T1 existiert, ist C1 die bessere Konvertierung.

In diesem Fall gibt es eine implizite Konvertierung von B sowohl int (T1) und double (T2). Es gibt eine implizite Konvertierung von int zu double, aber nicht umgekehrt. Daher wird die implizite Umwandlung von B zu int als besser angesehen und gewinnt.

+0

Die beste Antwort, die ich erwarten konnte, danke. Ich werde in einer Minute akzeptieren, wenn SO mir erlaubt;] –

+0

Würde ich richtigerweise annehmen, dass diese Regeln den Compiler dazu bringen würden zu denken, dass ein 'float' einem' double' überlegen ist? Das wäre ziemlich brillant. – supercat

0

Da Sie nicht angeben, was den Wert für den Compiler zu werfen

Console.WriteLine((int)(new B())); 

tut sollten Sie stattdessen folgende verwenden

Console.WriteLine((double)(new B())); 
+0

Ja, der Compiler macht das, aber das OP fragt, warum der Compiler das macht. – JaredPar