3

可能重复:
真的不可能使用返回类型重载吗?

有没有办法采用相同的方法并重载其返回类型?就像我在下面的代码中所做的那样。我试过这个,但它说两者之间存在歧义。

//supporting methods
private AutoResetEvent ReturnData = new AutoResetEvent(false);
public void PostMessage(string msg)
{ this.Message = msg; this.ReturnData.Set(); }
private string Message;
//a return value overload
public string GetMessage()
{
    this.ReturnData.WaitOne();
    return this.Message;
}
public byte[] GetMessage(){
    this.ReturnData.WaitOne();
    return encoder.GetBytes(Message);
}
4

4 回答 4

2

您不能通过 C# 中的返回类型重载。

当需要在 .NET 框架中完成类似的操作时,他们通常会更改方法名称以包含返回类型的名称。

例子:BinaryReader

double ReadDouble() { ... }
int ReadInt32() { ... }

例子:SQLDataReader

double GetDouble(int i) { ... }
int GetInt32(int i) { ... }
etc...

在您的情况下,您可以例如使用GetMessageStringand GetMessageBytes

于 2012-10-22T13:56:01.990 回答
2

这是C# 语言规范第 1.6.6 节的摘录:

“方法的签名在声明该方法的类中必须是唯一的。方法的签名由方法的名称、类型参数的个数及其参数的个数、修饰符和类型组成。方法的签名不包括返回类型。”

于 2012-10-22T13:56:16.590 回答
2

重载解决方案适用于方法签名。

方法签名由方法名称和参数类型和编号组成,但不包括返回类型。

这意味着您不能仅通过返回类型重载方法。

在这种情况下,更好的设计是根据返回类型来命名方法。

于 2012-10-22T13:56:50.163 回答
0

不,您不能,签名不依赖于返回类型,因此解决方案可能是:

public string GetMessageString()
{
    this.ReturnData.WaitOne();
    return this.Message;
}
public byte[] GetMessageBytes(){
    this.ReturnData.WaitOne();
    return encoder.GetBytes(Message);
}

或者您可以使用泛型类型解决问题:

public T GetMessage<T>()
{
    this.ReturnData.WaitOne();
    if(typeof(T) == typeof(string))
       return this.Message;
    else if(typeof(T) == typeof(byte[]))
       return encoder.GetBytes(Message);

    return default(T);
}
于 2012-10-22T13:58:49.257 回答