2014-02-09 10 views
60

Ich kann nicht verstehen, warum der Konstruktor mit dem Parameter Double[] ausgeführt wird?NULL zum Konstruktor übertragen

using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace MyConsoleApp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      D myD = new D(null); 
      Console.ReadLine();   
     } 

    } 

    public class D 
    { 
     public D(object o) 
     { 
      Console.WriteLine("Object"); 
     } 
     public D(double[] array) 
     { 
      Console.WriteLine("Array"); 
     } 
     public D(int i) 
     { 
      Console.WriteLine("Int"); 
     } 
    } 
} 

Ich denke, weil der erste Konstruktor einen Parameter des Referenztyps nimmt. Der erste Konstruktor mit einem Referenzparameter, weil null der Standardwert für Referenztypen ist.

Aber ich verstehe nicht warum nicht object, es ist auch ein Referenztyp.

+12

Sie bitten hier um Ärger. Wenn Sie Überladungen verwenden, wird das Einschließen als allgemeiner Typ als Objekt irgendwann zu einem Schmerz führen –

+1

@DavidHeffernan IDK.Meistens denke ich, welche Methode aufgerufen wird, ist eher intuitiv. Das Objekt wird nur aufgerufen, wenn nichts anderes angerufen werden kann. Intuitiv macht das Sinn, denn das Gegenteil wäre Unsinn – Cruncher

+2

Das ist eine tolle Interviewfrage! :) –

Antwort

90

Aber ich kann nicht verstehen, warum kein Objekt? Es ist auch ein Referenztyp?

Ja, beide double[] und object sind Referenztypen, so null auf beide implizit konvertierbar ist. Bei der Überladung von Elementen werden jedoch im Allgemeinen spezifischere Typen bevorzugt, sodass der Konstruktor double[] verwendet wird. Weitere Details finden Sie in Abschnitt 7.5.3 der C# -Spezifikation (und es gibt viele Details).

Insbesondere aus dem Abschnitt 7.5.3.5:

Gegeben seien zwei verschiedene Typen T1 und T2, T1 ist eine bessere Umwandlungstarget als T2 ist, wenn mindestens eines der folgenden gilt:

  • eine implizite Umwandlung von T1 bis T2 vorhanden ist, und keine implizite Konvertierung von T2 zu T1 existiert

dies hier der Fall ist, wo T1 ist double[] und T2 ist object. Es gibt eine implizite Umwandlung von double[] zu object, aber keine implizite Umwandlung von object zu double[], also ist double[] ein besseres Umwandlungsziel als object.

Wenn Sie die Verwendung des object Konstruktor erzwingen wollen, werfen gerade:

D myD = new D((object) null); 
+0

ist nicht 'double []' ein 'Objekt'? –

+3

@KhaledAKhunaifere: Ja, wenn also die Überladung, die 'double []' * * nicht einnimmt, die Überladung "Objekt" nennen würde - aber weil die Überladung 'double []' spezifischer ist als die Überladung 'Objekt', das ist der, der ausgewählt wird. –

19

Grundsätzlich double[] ein object ist, aber alle object s sind nichtdouble[] s. Als double[] ist die spezifischere Option, der Compiler wählt es als das spezifischste.

2

Bedenken Sie:

double[] d = new double[] {}; 
Console.WriteLine(d is object);//output is True 

double [] d ein Objekt ist.

dies so betrachten:

object z = new object[] {}; 
Console.WriteLine(z is double[]);//output is False 

Objekt [] z Doppel nicht []. Es gibt keine implizite Konvertierung von Objekt zu double [].

+2

Während dies wahre Beobachtungen sind, beantwortet diese Antwort allein nicht die Frage, warum 'new D (null)' den Konstruktor bevorzugt, den es tut. – doppelgreener

Verwandte Themen