2010-04-16 71 views
7

讓我們假設我有這三種方法定義:函數重載

int F1(int, int); 
int F1(float, float); 
Float F1(int, int); 

我在這裏調用方法F1:

Console.writeline(F1(5,6).ToString())); 

哪一種方法,它會調用爲什麼?

回答

16

第一個和第三個函數不會在相同的名稱空間中編譯。

這是因爲函數簽名根據參數的類型和數量來區分,並且它們是相同的。返回類型不被視爲方法簽名的一部分。

如果您只有名稱空間中的第一個和第二個(或第二個和第三個),則會調用最合適的一個(傳入整數類型的那個類型,因爲您正在傳入整數)。

Eric Lippert有一些很棒的blog entries關於C#的微妙之處。

+1

+1對於Lippert鏈接 – 2010-04-16 07:59:07

0

你試過了嗎?

你可能會認爲它應該既可以執行:

int F1(int, int); 

Float F1(int, int); 

函數重載,然而,這並不對返回值的工作 - 那就是必須是唯一的參數類型,所以這甚至不會編譯。

-1

在C#中是參數重載,而不是函數重載。您可以更改方法的輸入參數,這可能會導致不同的返回類型,但不能指定不同的返回類型來區分您的方法。

0

In函數的函數重載名稱是相同的,但它們在參數類型或參數個數上都不相同。

In函數不考慮函數重載函數的返回類型。

所以這段代碼甚至不會編譯。因爲你不能在一個命名空間中寫完全相同的函數。

2

編譯錯誤,因爲在您的程序中使用了相同的函數簽名兩次!

int F1(int, int); 

Float F1(int, int); 

函數簽名是這是你的情況相同(功能+論據+類型爲每個參數號名稱)...

-1

基本上函數重載是OOPS的一個重要特徵。

它允許你有多個同名的方法,但在參數列表中有變化。

什麼構成函數重載,什麼不叫函數重載,以及爲什麼它是編譯時多態性的文章Function Overloading in OOPS

1
class Program 
{ 
    static void Main(string[] args) 
    { 

     Add(3, 4,3); 
    } 
    public static void Add(int FN, int SN) 
    { 
     Console.WriteLine("Total is {0}", FN + SN); 
    } 
    public static void Add(int FN, int SN, int TN) 
    { 
     Console.WriteLine("Total is {0}", FN + SN + TN); 
    } 
} 

方法重載和函數重載術語可以互換使用中很好的解釋。方法重載允許一個類擁有多個具有相同名稱的方法。但是簽名不同。可以根據參數的數量,類型(int,float等)和類型(Value,ref或out)重載C#函數。 該方法的簽名不包括返回類型和參數修飾符。所以,根據返回類型和params修飾符重載一個函數是不可能的。