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();