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

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

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

Neden x dinamik, derleyici yeterince akıllı değil ya da önemli bir şeyi özlüyorum?Dinamik arama neden dinamik sonuç döndürüyor?

Eğer dynamic bir atması eklemek

+0

Yalnızca bir "Hashtable" döndüren tek bir 'Foo 'işleviniz varsa ne olur? Derleyici, geri dönüş değeri olarak ne geri döneceğini önceden bilmez. Sonuçta anında "Foo" için uygulama oluşturmuş olabilirsiniz (çalışma zamanında). –

+0

@Hamish Grubijan, 'Foo' işlevini çağırdığınızda derleyici derleme zamanında hangi işlevin çağrıldığını bilir. Bu işlevi statik yapmayı deneyin, F12'ye basın ve doğrudan doğru işleve gidecektir. –

+0

@Darin, bunu neden statik yapmak fark yaratıyor? –

cevap

4
sadece burada tahmin ediyorum

, ama ..., tüm ifade dinamik bir ifade olur. Dinamik bir ifadenin sonucu her zaman dynamic olacaktır, çünkü her şey çalışma zamanında çözülür. Daha fazla bilgi için dynamic kullanımıyla ilgili MSDN sayfa üzerinden

Kontrol:

Using Type dynamic (C# Programming Guide)

Ve aşağıdaki metin ilerleyin:

en dinamik faaliyet sonucu kendisi dinamiktir.

+0

Evet, ancak bu yalnızca iyi derlenir: 'dize x = Foo ((dinamik)" abc "); –

+0

Tüm yöntemler dizgeyi döndürürse, neden çalışma zamanında çözülmelidir? – dotneter

+0

@Darin - Gönderdiğim bağlantıya göz atın. Ayrıca, dinamik geri dönüşlerin statik türlere dönüştürülmesini de kapsar. Şuna bakın: "Tersine, örtük bir dönüşüm, dinamik türdeki herhangi bir ifadeye dinamik olarak uygulanabilir." Bu durumda, ifadenin sonucu hala dinamiktir, ancak x'i bir statik tür olarak bildirdiğinizden, dolaylı olarak geri dönüştürülür. –

3

Bu blog gönderme sizin için yararlı olabilir: Özellikle http://blogs.msdn.com/b/cburrows/archive/2010/04/01/errata-dynamic-conversions-and-overload-resolution.aspx

: "dinamik argüman olan bir yöntem çağrısı varsa, dinamik dönemini gönderilir." Bu, C# çalışma zamanına kadar hangi aşırı yükün çağrıldığını bilmediği anlamına gelir. Derleme zamanında bilmiyor. Benim anladığım kadarıyla, kontrolünü, olası aşırı yüklerin derleme zamanında ne olduğunu (neden olsun?), Ya da sizin durumunuzda tüm ipleri döndürdüğünü not edin.

Yani derleme zamanında, Foo dönüş değeri bilinmemektedir. Bu nedenle x tipi, dynamic olmak üzere derleme zamanında belirlenir.