2013-10-11 54 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引入之前就已经做出了。他们设计的语言允许在返回类型上重载,这在技术上是可行的;但事实确实如此,因为诸如你的榜样之类的事情,他们并没有这样做。 –

相关问题