2009-11-12 17 views
30

'da dinamik olabilir C# 4.0'da, aşağıdaki kodda olduğu gibi dinamik yöntem parametreleri mümkün mü?Yöntem parametreleri C#

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

C# 4.0'deki dinamik anahtar kelimenin birçok güzel örneğini buldum, ancak yukarıdaki gibi değil. Bu soru elbette python'un nasıl çalıştığından esinlenmiştir.

cevap

41

Evet, kesinlikle bunu yapabilirsiniz. Statik aşırı yükün çözümü için, object parametresi olarak kabul edilir (ve statik olarak adlandırılır). Yöntemde yaptığınız şey daha sonra dinamik olacaktır. Örneğin:

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"); 
    } 
} 

"dinamiktir nesne gibi" doğa sadece bir dynamic parametreyle şey sadece bir object parametre ile aşırı yük ve bir olamaz anlamına gelir. Bu makale geç bağlama çok verimsiz ima

+0

Bu yazı için çok teşekkür ederim! – Darren

+0

Bu güncellenmiş makaleyi ChrisB (http://blogs.msdn.com/b/cburrows/archive/2010/04/01/errata-dynamic-conversions-and-overload-resolution.aspx) ile doğru bir şekilde anladığım halde Bu davranış değişmiş gibi görünüyor. Sesler her zaman dinamik olarak gönderilir, çalışma zamanında belirlenen parametrelerin türüne/tiplerine göre seçilen aşırı yüklenme. – BitMask777

+2

@ BitMask777: Yalnızca * argümanlardan biri (veya hedef) dinamikse. Yani cevabımdaki kodda 'Foo (" merhaba ")' nin hiçbir dinamik argümanı yoktur, bu yüzden 'Foo (dyanmic)' statik olarak bağlıdır. –

2

Evet, bunu yapabilirsiniz. C# 4.0 spesifikasyonu belirtildiği üzere bir tip beklenen yerde, dilbilgisi dynamic desteklemek için genişletilmiştir:

tip:
            ...
          dynamic

Bu, elbette parametre tanımlarını içerir.

0

Evet; bakınız örn.

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

veya Chris' diğer bloglar

. Veya VS2010 Beta2'yi alın ve deneyin.

+0

Not. Güçlü yazarak arkadaşın! –

+1

@David: DLR'deki dinamik davranış, oldukça mümkün olduğu kadar verimli olmak için oldukça düzgün bir şekilde yapılır. Evet, geç kalmış ama beklediğiniz kadar verimsiz değil. –

İlgili konular