2009-11-12 8 views
30

In C# 4.0 sind dynamische Methodenparameter möglich, wie im folgenden Code?Können Methodenparameter in C# dynamisch sein

public string MakeItQuack(dynamic duck) 
{ 
    string quack = duck.Quack(); 
    return quack; 
} 

Ich habe viele coole Beispiele für das dynamische Keyword in C# 4.0, aber nicht wie oben. Diese Frage ist natürlich davon inspiriert, wie Python funktioniert.

Antwort

41

Ja, das können Sie absolut tun. Für die Zwecke der statischen Überladungsauflösung wird es als object-Parameter behandelt (und statisch bezeichnet). Was Sie innerhalb der Methode tun, wird dann dynamisch sein. Zum Beispiel:

using System; 

class Program 
{ 
    static void Foo(dynamic duck) 
    { 
     duck.Quack(); // Called dynamically 
    } 

    static void Foo(Guid ignored) 
    { 
    } 

    static void Main() 
    { 
     // Calls Foo(dynamic) statically 
     Foo("hello"); 
    } 
} 

Die „dynamisch ist wie Objekt“ Natur bedeutet, dass Sie nicht eine Überlastung mit nur einem object Parameter und eine mit nur einem dynamic Parameter haben kann.

+0

Das ist unglaublich vielen Dank für diesen Beitrag! – Darren

+0

Wenn ich diesen aktualisierten Artikel von ChrisB (http://blogs.msdn.com/b/cburrows/archive/2010/04/01/errrata-dynamic-conversions-and-overload-resolution.aspx) dann richtig verstehe Es scheint, dass sich dieses Verhalten geändert hat. Klänge wie Anrufe werden immer dynamisch gesendet, wobei die Überladung entsprechend dem (den) Typ (en) der Parameter ausgewählt wird, die zur Laufzeit festgelegt werden. – BitMask777

+2

@ BitMask777: Nur wenn eines der * Argumente * (oder Ziel) dynamisch ist. Also hat der 'Foo (" hallo ")' im Code meiner Antwort keine dynamischen Argumente, also ist 'Foo (dyanmisch)' statisch gebunden. –

2

Ja, das können Sie tun. Als C# 4.0-Spezifikation angegeben in, wird die Grammatik dynamic überall dort, wo ein Typ erweitert und unterstützt erwartet wird:

Typ:
            ...
          dynamic

Dies beinhaltet natürlich Parameterdefinitionen.

0

Ja; siehe z.B.

http://blogs.msdn.com/cburrows/archive/2008/11/14/c-dynamic-part-vi.aspx

oder anderen Blogs Chris. Oder schnappen Sie sich VS2010 Beta2 und probieren Sie es aus.

+0

Beachten Sie, dass dieser Artikel die späte Bindung sehr ineffizient impliziert. Starkes Tippen ist dein Freund! –

+1

@David: Das dynamische Verhalten im DLR ist ziemlich sauber, um so effizient zu sein, wie es vernünftig möglich ist. Ja, es ist spät gebunden, aber es ist nicht so ineffizient, wie Sie vielleicht erwarten. –

Verwandte Themen