2011-11-12 10 views
22

C# derleyicisi neden bu kod parçasının geçersiz olduğunu söylemiyor? Ben statik yönteminden bir statik olmayan bir yöntemi çağırmak için çalışıyorum çünküNeden C# derleyicisi, dinamik argümanlı çağrı sitelerinde yöntemin "statikliğini" kontrol etmiyor?

class Program 
{ 
    static void Main(string[] args) 
    { 
     dynamic d = 1; 
     MyMethod(d); 
    } 

    public void MyMethod(int i) 
    { 
     Console.WriteLine("int"); 
    } 
} 

MyMethod çağrısı zamanında başarısız olur. Bu çok makul, ancak derleyici neden derleme zamanında bir hata olarak düşünmüyor?

şu

class Program 
{ 
    static void Main(string[] args) 
    { 
     dynamic d = 1; 
     MyMethod(d); 
    } 
} 

böylece dinamik sevk rağmen derleyici MyMethod var olduğundan etmez derlemek olmaz. Neden "statikliği" doğrulamıyor?

cevap

14

Aşırı yükleme çözünürlüğü burada dinamiktir. Bu kod snippet'inde görünür:

class Program { 
    public static void Main() { 
     dynamic d = 1.0; 
     MyMethod(d); 
    } 

    public void MyMethod(int i) { 
     Console.WriteLine("int"); 
    } 

    public static void MyMethod(double d) { 
     Console.WriteLine("double"); 
    } 
} 

İyi çalışıyor. Şimdi 1'e d atayın ve çalışma zamanı hatasını not alın. Derleyici, derleme zamanında dinamik aşırı yük çözünürlüğünü makul bir şekilde taklit edemez, bu yüzden denemez.

+2

Ancak "MyMethod" adıyla örnek yöntemi yoksa, * bir derleme hatası oluşturabilir * olması gerekir ???? Görünüşe göre derleyici, hiç yok diye düşünecek kadar zekidir "diye bir şey yok ... böylece cevabınız beni henüz ikna etmedi ... belki biraz daha fazla detaylandırırsın? :-) –

+1

Neden almıyorum (çalışma zamanı) Aşırı yük çözünürlüğü, çağrı siteminin statik bir yöntemde olduğu durumlarda tüm örnek yöntemlerini hesaba katar. – CodesInChaos

+1

İyi bir tanılama oluşturmaya çalıştığı için. Programcı aşırı yüklemeyi yapmayı mı unuttun? Ya da statik anahtar sözcüğünü unuttu mu? –

0

Derleyici, dynamic türündeki on/with değişkenindeki işlemi bulduğunda, bu bilgiyi CallSite nesnesini kullanarak yayacaktır. (CallSite nesnesi, çağrı hakkında bilgi depolar.)

İlk örnekte, derleyici bilgiyi (örneğin, arama türü, aramak istediğiniz yöntem vb.) Yayabildiği için derleyebilir. İkinci kodda, mevcut olmayan yöntemi çağırmaya çalışın, böylece derleyici sizin için IL kodu yayınlayamaz.

+0

Zaman ayırdığınız için teşekkür ederiz.İkinci örneğin neden derlenmediğini sormuyorum ve derleyicinin ilk örnek için IL yayabileceğini tamamen kabul ediyorum. Benim sorduğum şey aslında ilk örneğe neden izin veriyor? Neden statik anahtar kelimeyi MyMethod'a eklememi hatırlamıyorum? – Rune

İlgili konular