2010-10-22 11 views
10
public string Foo(object obj) { 
    return null; 
} 

public string Foo(string str) { 
    return null; 
} 

var x = Foo((dynamic) "abc"); 

Warum ist X dynamisch, Compiler nicht intelligent genug oder ich vermisse etwas Wichtiges?Warum dynamischer Aufruf gibt dynamisches Ergebnis zurück?

+0

Was wäre, wenn Sie nur eine einzige "Foo" -Funktion hätten, die eine 'Hashtable' zur Verfügung stellt? Der Compiler weiß nicht im Voraus, was als Rückgabewert zurückkommt. Du hättest die Implementierung für 'Foo' only (zur Laufzeit) generieren können. –

+0

@Hamish Grubijan, wenn Sie die "Foo" -Funktion aufrufen, weiß der Compiler, welche Funktion zur Kompilierzeit aufgerufen wird. Versuchen Sie, diese Funktion statisch zu machen, drücken Sie F12 und es wird direkt zur richtigen Funktion navigiert. –

+0

@Darin, warum macht es statisch einen Unterschied? –

Antwort

4

Ich kann nur raten hier, aber ...

Wenn Sie eine Besetzung zu dynamic hinzufügen, wird der gesamte Ausdruck ein dynamischer Ausdruck. Das Ergebnis eines dynamischen Ausdrucks ist immer dynamic, da alles zur Laufzeit aufgelöst wird.

Check out der MSDN-Seite auf dynamic für weitere Informationen mit:

Using Type dynamic (C# Programming Guide)

und blättern Sie zu dem folgenden Text:

Das Ergebnis der dynamischsten Operationen selbst dynamisch.

+0

Ja, aber das kompiliert gerade gut: 'string x = Foo ((dynamische)" abc ");' –

+0

Warum muss es zur Laufzeit aufgelöst werden, wenn alle Methoden String zurückgeben? – dotneter

+0

@Darin - Überprüfen Sie den Link, den ich gepostet habe. Es umfasst auch implizite Konvertierungen von dynamischen zurück zu statischen Typen. Suchen Sie nach: "Umgekehrt kann eine implizite Konvertierung dynamisch auf jeden Ausdruck vom Typ dynamic angewendet werden." In diesem Fall ist das Ergebnis des Ausdrucks immer noch dynamisch, aber da Sie x als statischen Typ deklarieren, wird es implizit zurückkonvertiert. –

3

könnte Dieses Blog-Posting Ihnen nützlich sein: http://blogs.msdn.com/b/cburrows/archive/2010/04/01/errata-dynamic-conversions-and-overload-resolution.aspx

Insbesondere: „Wenn Sie einen Methodenaufruf mit einem dynamischen Argumente haben, ist es Zeit dynamisch versandt wird.“

Das bedeutet, dass C# nicht weiß, welche Überladung bis zur Laufzeit aufgerufen wird. Es weiß nicht zur Kompilierzeit. Mein Verständnis ist, dass es nicht einmal überprüfen Sie, was die möglichen Überladungen zur Kompilierzeit sind (warum sollte es?), Oder notieren Sie die Tatsache, dass in Ihrem Fall sie alle Zeichenfolgen zurückgeben.

So zur Kompilierzeit ist der Rückgabewert Foo nicht bekannt. Daher wird der Typ x zur Kompilierungszeit dynamic bestimmt.

Verwandte Themen