2015-02-24 27 views
21

Belirsiz olmayan garip bir duruma rastladım, ancak aşırı yük çözücü bunu düşünmüyor. Düşünün:Neden bu durumda C# doğru aşırı yükü çözemiyor?

public static class Program 
{ 
    delegate int IntDel(); 
    delegate string StringDel(); 

    delegate void ParamIntDel(int x); 
    delegate void ParamStringDel(string x); 

    static void Test(IntDel fun) { } 
    static void Test(StringDel fun) { } 
    static void ParamTest(ParamIntDel fun) { } 
    static void ParamTest(ParamStringDel fun) { } 

    static int X() { return 42; } 
    static void PX(int x) { } 

    public static void Main(string[] args) 
    { 
     ParamTest(PX); // OK 
     Test(X); // Ambiguos call! 
    } 
} 

Nasıl ParamTest aşırı çağrısı gelip doğru çözülürse ancak Test aşırı belirsiz?

+7

Derleyici bir aşırı yükleme seçtiğinde, bir yöntemin dönüş türü dikkate alınmaz. Bir yöntemi çağırdığınızda gerçekte dönüş değerini kullanmamanın otomatik bir sonucu. Burada önemsiz bir şekilde çözüldü, sadece “Test (yeni IntDel (X)) kullanın” –

+0

Bunun Java ve C++ için de geçerli olduğuna inanıyorum. Ancak, parametrik polimorfizmin temel bir sınırlaması değildir, örneğin Haskell'de geri dönüş türüne göre aşırı yüklenebilirsiniz. Sorun, dönüş türüne aşırı yüklenmeye izin verilmesi, tür çıkarımında bazı sorunlara neden olabilir. – Bakuriu

+2

Offtopic: Bugünlerde neredeyse her sorunun en az 1 yakın oyu nasıl alacağına bayılıyorum. XD –

cevap

37

belki https://msdn.microsoft.com/en-us/library/aa691131%28v=vs.71%29.aspx

için bir yöntem imzası özellikle dönüş türü içermez, ne de en sağdaki parametresi için belirtilen edilebilir parametreler modifiye edici içermez.

IntDel ve StringDel arasındaki tek fark dönüş değeridir. Daha özel olarak

: yöntem aşırı yüklenmesi bağlamında https://msdn.microsoft.com/en-us/library/ms173171.aspx

, bir yöntemin imza dönüş değeri içermez. Ancak temsilciler bağlamında imza, dönüş değerini içerir. Diğer bir deyişle, bir yöntem, temsilci ile aynı dönüş türüne sahip olmalıdır.

+0

8 dakika içinde gelen kabul ve sayma ... –

+0

@ Vilx - Delegeler ile yöntem aşırı yükleme açıkça konuşan başka bir başvuru eklendi. – xanatos

+0

int X() 'hem“ IntDel ”hem de“ StringDel ”olarak nasıl değerlendirilebilir? –

İlgili konular