Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与具有相同名称和不同返回类型的成员的接口_C#_.net_Interface_Method Signature - Fatal编程技术网

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

C# 与具有相同名称和不同返回类型的成员的接口,c#,.net,interface,method-signature,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 } 在C#中不允许使用它,因为当您使用Receive()调用它时,系统如何知道要调用哪个方法 调用

为何我不能做到以下几点

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

    Dictionary<string, string> Receive();
    byte[] Receive(); // Error
}
在C#中不允许使用它,因为当您使用
Receive()
调用它时,系统如何知道要调用哪个方法

调用返回的字典或字节数组

所以设计师们让它不受支持

例如:
var returnVal=ICommunication.Receive()

编辑:

公共接口i通信
{
int-Send(字典d);
int发送(字节[]b);
无效接收(输出字典);
无效接收(输出字节[]);
}

如果您决定对以下内容进行编码,该怎么办:

var x = Receive();

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

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

发件人:

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


不允许这样做,因为语言设计者认为这样做会引入太多的歧义。你必须给他们起不同的名字。请参阅此处进行讨论:但是该语言可能会强制您将返回值分配给特定类型以消除歧义。当然,但是匿名类型的隐式变量分配将不存在,如果您使用Linq ETC,这将是一个很大的功能,但不会影响匿名类型,对吗?因为方法名不会出现在其中。此外,这一决定早在引入
var
之前就已经做出了。他们设计的语言允许返回类型重载,这在技术上当然是可能的;但事实上,他们之所以没有这样做,是因为你的例子。我同意你的说法,但让我们假设这在历史上是可能的,然后引入了var或其他语法,这意味着你不必指定你想要的类型,然后你会遇到另一个问题。这种语言可能会迫使你将返回值赋给一个特定的类型以消除歧义。问题是,为什么语言的设计不是为了让你这么做?@matthewatson分配返回值???,它允许你用另一种方式来做。请参阅上面的“编辑”。我不认为通过在参数类型上重载来解决它是一个真正的解决方案。顺便说一下,请注意,IL本身确实支持在返回类型上重载。看+1,这是我从未想到过的解决方案。不过我讨厌我们的参数!:)
public interface ICommunication
{
    int Send(Dictionary<string, string> d);
    int Send(byte[] b);

   void Receive(out Dictionary<string, string>);
   void Receive(out byte[]); 
}
var x = Receive();