2

私は次のようないくつかの方法があります:

static public int GetInt(int _default = 0)
{
    // do work, return _default if error
}

static public int? GetInt(int? _default = null)
{
    // do work, return _default if error
}

これらのメソッドをオーバーライドとして使用するときに、それらを使用して割り当てる変数にも基づいてメソッドが選択されることを期待していました。

int value1 = GetInt();
int? value2 = GetInt();

ただし、これにより「あいまいな呼び出し」エラーが発生します。

これを回避するにはどうすればよいですか?

4

2 に答える 2

4

問題は、戻り値の型がC# のメソッドのシグネチャの一部ではないことです。したがって、メソッドに異なる名前を付ける必要があります。また、パラメーター名にアンダースコアを使用しないでください。

メソッド シグネチャがどのように機能するかについて MSDN を引用するには、次のようにします。

メソッドのシグニチャーは、メソッドの名前と、その各仮パラメーターの型と種類 (値、参照、または出力) で構成され、左から右の順序で考慮されます。メソッドのシグネチャには、特に戻り値の型が含まれていません。また、一番右のパラメーターに指定できる params 修飾子も含まれていません。

それを解決する方法です。タイプのデフォルトを返すので、それをジェネリックにして を使用できますdefault(T)

    static void Main(string[] args)
    {
        int value1 = GetInt<int>();
        int? value2 = GetInt<int?>();
    }


    static public T GetInt<T>(T defaultValue = default(T))
    {
        bool error = true;
        if (error)
        {
            return defaultValue;
        }
        else
        {
            //yadayada
            return something else;
        }
    }
于 2011-08-25T18:53:39.330 に答える
2

スイッチ アーキテクチャ。

 static public T GetInt<T>(T defaultValue = default(T))
    where T: struct
 {
     // Do Work.

     // On failure
     return defaultValue; 
 }

次に、関数を呼び出すときに、ジェネリック型の恩恵を受ける必要があります。

 int value1 = GetInt(0);
 int? value2 = GetInt(default(int?));

または、デフォルト値を省略したい場合:

 int value1 = GetInt<int>();
 int? value2 = GetInt<int?>();

または、デフォルト値だけが必要な場合は、単に返すことができます

 return default(T);

更新: 制約が追加されました - 明らかに、ジェネリックにすることの問題は、任意の型を指定できることです。ただし、問題は、整数を に変換することを準拠させることになりますT

于 2011-08-25T18:54:00.320 に答える