2015-05-07 7 views
18

Beispielcode:null dynamische Variable und Funktion Überlastung

private void DoSomething(object obj) 
{ 
    MessageBox.Show("called object"); 
} 

private void DoSomething(params object[] obj) 
{ 
    MessageBox.Show("called object[]"); 
} 


private void button1_Click(object sender, EventArgs e) 
{ 
    decimal? amount = null; 
    dynamic obj = amount; 

    DoSomething(obj); 
} 

Wenn die Taste 1 gedrückt wird, wird die Meldung "genannt Objekt []" angezeigt. Es scheint, dass die überladene Methode mit dem Parameter object [] in diesem Beispiel bevorzugt ist. Irgendwelche Ideen warum? Ich bin nur mehr als alles andere neugierig.

(Hintergrund: Dieses Verhalten verursachte einige unerwartete Ergebnisse in Razor mit dynamischen Ansichten Formatting nullable decimal in RazorEngine).

Antwort

18

Das ist, weil Sie object[] zu object und nicht anders herum casten können. object[] ist spezifischer und daher in der Methodenauflösung bevorzugt.

7.5.3.2 Bessere Funktion Mitglied

(...)

ein Argument Liste A mit einer Reihe von Argumenten Ausdrücke { E1, E2, ..., EN } und zwei einsetzbare Funktionselemente MP und MQ mit Parametertypen Gegeben { P1, P2, ..., PN } und { Q1, Q2, ..., QN }, MP ist als ein besseres Funktionselement als MQ definiert, wenn

  • für jedes Argument ist die implizite Konvertierung von EX zu QX nicht besser als die impliziten Konvertierung von EX zu PX und
  • für mindestens ein Argument, die Umwandlung von EX zu PX besser ist als die Umwandlung von EX zu QX.

und später auf der bessere Conversion-Ziel definiert wird:

7.5.3.5 Bessere Umwandlung Ziel

Gegeben seien zwei verschiedene Arten T1 und T2, T1 ist eine bessere Umwandlungsziel als T2, wenn mindestens eines der folgenden Elemente gilt:

  • Eine implizite Konvertierung T1-T2 existiert und keine implizite Konvertierung T2-T1 existiert

(...)

In Ihrem Beispiel T1 ist object[] und T2 ist object .

+0

für alle, die sich wundern, das Buch in dieser Antwort zitiert wird: https://books.google.co.in/books?id=s-IH_x6ytuQC – imlokesh

+1

@imlokesh Sie liegen falsch. Ich habe C# Spezifikation zitiert, kein Buch. – MarcinJuraszek

+0

mein schlechter, ich suchte nach dem genauen Text, den Sie zitierten, und dies war das erste Ergebnis. :) – imlokesh

7

Das Problem ist nicht spezifisch für "dynamische Nullvariable". Selbst wenn Sie DoSomething(null) anrufen, wird die object[] Überladung bevorzugt.Diese

ist, weil, obwohl null sein kann entweder object oder object[], wobei letzteres bevorzugt wird aufgrund wobei ein bessere Konvertierung Ziel wie erläutert durch MarcinJuraszek.

Wenn Sie jedoch die Art explizit wie folgt angeben:

object x = null; 
DoSomething(x); 

Dann wird die object Überlastung wird aufgerufen, da der Compiler bereits den Typ der Null Variable kennt.

Verwandte Themen