2010-05-01 103 views
6

在C#中超載,是有可能有相同的參數又互相覆蓋(他們在返回類型不同)具有相同的參數簽名

public override Stocks[] Search(string Field,string Param){ //some code} 
public override Stocks Search(string Field, string Param){//some code} 

C#返回編譯錯誤

+0

如果我沒有指派返回值會發生什麼,但而只是叫做「Search(field,param);'? – 2010-05-01 16:21:50

+0

我明白你的暗示什麼,我也想過這個問題爲好, – Soham 2010-05-01 19:03:07

回答

0

至於我知道,這是不可能的。

即使它是,它是不必要的複雜。只需在所有情況下返回一個數組(如果只返回一個值,那麼它就是一個Stocks數組[1])。這應該會節省一些時間,特別是因爲C#使得數組非常簡單。

11

在C#中,只能重載具有不同簽名的方法。

的方法的返回類型不被包括在簽名 - 只有方法的名稱,類型和參數的數量(和它們的順序)。這兩個例子具有相同的簽名,所以它們不能一起存在。

經典,可以恢復項目(數組或其他數據結構)的列表 - 如果只需要一個項目,你只需用一個項目返回一個列表。

+0

我想,我會用一個列表 – Soham 2010-05-01 19:04:31

0

否 - 編譯器拋出錯誤,因爲它只使用參數來確定調用哪個方法,而不是返回類型。

+1

@Adam V進 - 它也使用方法名;) – Oded 2010-05-01 16:18:41

+0

@Oded - 想通這是不必要的說。 :) – 2010-05-01 16:21:34

+0

@Oded,:)不像編譯器會運行尋找接受特定參數序列的所有可能的方法,而不考慮名稱......對不起,這個想法讓我不得不分享。 – 2010-05-01 16:24:52

0

不,你不能。

CLR允許它,但由於某些原因,C#dudes決定不使用此CLR功能。

+2

很難用一種被認爲是C族成員的語言來支持,他們的成員通常沒有情境依賴評估的概念。 – 2010-05-01 16:27:33

3

由於Oded已在他的回答中指出,當唯一的區別是返回類型時,不可能重載方法。

public override Stocks[] Search(string Field,string Param){ //some code} 
public override Stocks Search(string Field, string Param){//some code} 

想一想:編譯器應該如何知道調用哪個方法變量?這顯然取決於你的搜索結果,顯然編譯器不能提前知道。

其實,你想要的是一個函數有兩種可能的返回類型。你不要想要的是兩個獨立的方法,因爲你必須先決定哪一個要打電話。這顯然是錯誤的方法。

一種解決方案是總是返回一個數組;在只有一個Stocks找到對象的情況下,通過使用多個接口,返回尺寸1.

1

的陣列方式:

struct Stock { public string Symbol; public decimal Price;} 
interface IByArray { Stock[] Search(string Field, string Param); } 
interface IByClass { Stocks Search(string Field, string Param); } 
class Stocks : IByArray, IByClass 
{ 
    Stock[] _stocks = { new Stock { Symbol = "MSFT", Price = 32.83m } }; 
    Stock[] IByArray.Search(string Field, string Param) 
    { 
     return _stocks; 
    } 
    Stocks IByClass.Search(string Field, string Param) 
    { 
     return this; 
    } 
} 
相關問題