3

重複の可能性:
戻り値の型のオーバーロードを使用することは本当に不可能ですか?

同じメソッドを取得してその戻り値の型をオーバーロードする方法はありますか? 以下のコードで行ったように。これを試しましたが、2つの間にあいまいさがあると言われています。

//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

オーバーロードの解決は、メソッド シグネチャで機能します。

メソッド シグネチャは、メソッド名とパラメーターの型と数で構成されますが、戻り値の型は構成されません。

これは、戻り値の型だけでメソッドをオーバーロードできないことを意味します。

この場合、戻り値の型に応じてメソッドに名前を付けるように設計することをお勧めします。

于 2012-10-22T13:56:50.163 に答える
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 に答える
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 に答える