与具有相同名称和不同返回类型的成员的接口

时间:2013-10-11 10:34:49

标签: c# .net interface method-signature

为什么我不能做以下事情?

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

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

Receive()的符号不同但参数相同。为什么编译器会查看参数而不是成员签名?

  

ICommunication'已经定义了一个名为'Receive'的成员   相同的参数类型。

我怎么能绕过这个?

我可以重命名Receive(),但我更喜欢将其命名为Receive()

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

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

3 个答案:

答案 0 :(得分:6)

返回类型不是方法签名的一部分,因此从语言的角度来看,接口声明了两次相同的方法。

来自Microsoft's C# Programming Guide

  

为了方法重载的目的,方法的返回类型不是方法签名的一部分。但是,在确定委托与其指向的方法之间的兼容性时,它是方法签名的一部分。

答案 1 :(得分:3)

如果您决定编写以下内容,该怎么办:

var x = Receive();

它应该使用什么方法?什么是返回类型?

答案 2 :(得分: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[]); 
}