如何为返回类型重载

时间:2012-10-22 13:54:16

标签: c# .net

  

可能重复:
  Really impossible to use return type overloading?

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

//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 个答案:

答案 0 :(得分:2)

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

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

示例:BinaryReader

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

示例:SQLDataReader

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

在您的情况下,您可以使用GetMessageStringGetMessageBytes

答案 1 :(得分:2)

这是C# language specification

第1.6.6节的摘录
  

“方法的签名在声明方法的类中必须是唯一的。方法的签名包括方法的名称,类型参数的数量以及数量,修饰符和类型参数。方法的签名不包括返回类型。“

答案 2 :(得分:2)

重载解析适用于方法签名。

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

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

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

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