【问题标题】:Interface with members with same name and different return types与具有相同名称和不同返回类型的成员的接口
【发布时间】:2013-10-11 10:34:49
【问题描述】:

为什么我不能执行以下操作?

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

【问题讨论】:

标签: c# .net interface method-signature


【解决方案1】:

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

来自Microsoft's C# Programming Guide

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

【讨论】:

    【解决方案2】:

    如果您决定编写以下代码会怎样:

    var x = Receive();
    

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

    【讨论】:

    • 但该语言可能会强制您将返回值分配给特定类型以消除歧义。
    • 绝对是这样,但是匿名类型的隐式变量赋值将不存在,如果您使用 Linq 等,这是一个相当大的功能
    • 这不会影响匿名类型,不是吗?因为方法名称不会出现在其中。另外,这个决定早在var 被引入之前就已经做出了。从技术上讲,他们设计语言以允许返回类型重载当然是可能的。但确实他们没有这样做是因为你的例子。
    • 我同意你的说法,但可以说它在历史上是可能的,然后引入了 var 或其他一些语法,这意味着你不必指定你想要的类型,那么你手头上就会有另外一个问题。
    【解决方案3】:

    在 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[]); 
    }
    

    【讨论】:

    • 该语言可能会强制您将返回值分配给特定类型以消除歧义。问题真的是为什么设计的语言不是为了让你这样做?
    • @MatthewWatson 分配返回值???,它允许你以另一种方式来做。请参阅上面答案中的编辑。
    • 我真的不认为通过重载参数类型来解决它是一个真正的解决方案。 ;) 顺便提一下,IL 本身确实 支持返回类型的重载。见blogs.msdn.com/b/abhinaba/archive/2005/10/07/478221.aspx
    • +1 这是我从未想过的解决方案。我讨厌参数! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多