2011-05-16 33 views
2

可能重複:
C# 4: conflicting overloaded methods with optional parametersC#與接口重載方法行爲

我只是有一個小的研究和創造下一個代碼。

namespace Test { 
class Program 
{ 
    public interface ITestA 
    { 
     void MethodA(int a, int b); 
    } 

    public class TestAClass : ITestA 
    { 
     public void MethodA(int a, int b) 
     { 
      Console.WriteLine("MethodA with param"); 
     } 

     public void MethodA(int a, int b, bool logic = true) 
     { 
      Console.WriteLine("MethodA logic with param"); 
     } 
    } 

    public interface ITestB 
    { 
     void MethodA(int a, int b, bool logic = true); 
    } 

    public class TestBClass : ITestB 
    { 
     public void MethodA(int a, int b) 
     { 
      Console.WriteLine("MethodB with param"); 
     }   

     public void MethodA(int a, int b, bool logic = true) 
     { 
      Console.WriteLine("MethodB logic with param"); 
     } 
    } 

    static void Main(string[] args) 
    { 
     var testA = new TestAClass(); 
     testA.MethodA(1, 1);    
     var testB = new TestBClass(); 
     testB.MethodA(1, 1); 
    } 
} } 

我有一個問題,爲什麼編譯器總是選擇短的方法有兩個參數。當然,所有這些工作都是以相同的方式進行,沒有Interface。

由於

+3

因此,如果它的工作方式與使用和不使用界面相同,爲什麼在您的問題中顯示界面?這個想法是使用*最少量的代碼來重現行爲。這讓我們專注於實際問題,而不是不相關的細節。 – 2011-05-16 12:25:06

+2

此外,這是肯定**不**操作符重載,而是*方法*重載,完全不同的事情。 – 2011-05-16 12:25:49

+2

主要問題是可選參數,而不是接口。 – Rik 2011-05-16 12:29:50

回答

2

這歸結爲如何編譯器將命名和可選參數
檢查出this article at MSDN欲瞭解更多信息,尤其是重載分辨率

如果兩個候選人被判斷爲一樣好,偏好將轉到不具備這些論點在調用省略可選參數的候選人。這是因爲參數較少的候選人在重載分辨率方面普遍偏好的結果。

這就是爲什麼在你的情況下,編譯器選擇沒有任何可選參數的方法。

1

由於編譯器發現完全對應於調用方法和使用該方法。
編譯器搜索其他合適的方法,如果第一種方法失敗...