2013-10-11 63 views
2

爲什麼我不能執行以下操作?具有相同名稱和不同退貨類型的會員的接口

public interface ICommunication 
{ 
    int Send(Dictionary<string, string> d); 
    int Send(byte[] b); 

    Dictionary<string, string> Receive(); 
    byte[] Receive(); // Error 
} 

Receive()的signarure是不同的,但這些參數是相同的。爲什麼編譯器會查看參數而不是成員簽名?

ICommunication'已經用 相同的參數類型定義了一個名爲'Receive'的成員。

我怎麼能解決這個問題?

我可以將Receive()重命名爲如下,但我寧願將它保留爲Receive()

public interface ICommunication 
{ 
    int Send(Dictionary<string, string> d); 
    int Send(byte[] b); 

    Dictionary<string, string> ReceiveDictionary(); 
    byte[] ReceiveBytes(); 
} 
+3

你不能這樣做,因爲語言設計者認爲它會引入太多的含糊之處。你必須給他們分開的名字。請參閱此處進行討論:http://stackoverflow.com/questions/442026/function-overloading-by-return-type –

回答

6

返回類型不是方法簽名的一部分,所以從語言的角度來看,接口聲明兩次相同的方法。

Microsoft's C# Programming Guide

的方法的返回類型不是對方法重載的目的的方法的簽名的一部分。但是,在確定委託與指向的方法之間的兼容性時,它是方法簽名的一部分。

1

它不是在C#中允許的,因爲當你Receive()叫它如何系統知道哪些方法調用?

調用返回字典或字節數組?

所以設計師使它不支持

如:var returnVal = ICommunication.Receive()

編輯:

public interface ICommunication 
{ 
    int Send(Dictionary<string, string> d); 
    int Send(byte[] b); 

    void Receive(out Dictionary<string, string>); 
    void Receive(out byte[]); 
} 
+0

該語言可能會迫使您將返回值分配給特定類型以消除其歧義。這個問題真的是*爲什麼*不是爲了讓你這樣做而設計的語言? –

+0

@MthetheWWatson指定返回值???,它允許您以另一種方式進行操作。上面的答案見編輯。 –

+0

我並不真正考慮通過在參數類型上重載解決方案來解決這個問題。 ;)順便說一下,請注意IL本身*不支持在返回類型上重載。見http://blogs.msdn.com/b/abhinaba/archive/2005/10/07/478221.aspx –

3

如果你決定編寫以下:

var x = Receive(); 

什麼方法應該是使用?什麼是返回類型?

+0

但是該語言可能會迫使您將返回值分配給特定的類型以消除它的歧義。 –

+0

絕對,但然後匿名類型的隱式變量分配不存在這是一個相當大的功能,如果你使用Linq等 – Ric

+0

這不會影響匿名類型,但它?因爲方法名稱不會進入它。另外,這個決定早在var引入之前就已經做出了。他們設計的語言允許在返回類型上重載,這在技術上是可行的;但事實確實如此,因爲諸如你的榜樣之類的事情,他們並沒有這樣做。 –

相關問題