2

私には機能があります

public List<Item> Filter(params String[] valuesOrdered)
{
    //...
}

これは、すべての に対するフィルタとして機能しますItem

public class Item
{
    List<String> propertiesOrdered;
    //...
}

そのため、 eg を呼び出すと、最初のエントリとしてFilter("prop1")すべてItemの s の"prop1"プロパティが一致します。

を呼び出すFilter()と、すべてItemの s が返されます。

また、値を一致させる必要がありnullます。たとえば、今すぐ呼び出すFilter(null, null)と、最初のプロパティとしてすべてItemの snull, nullが一致します。

を呼び出す場合を除いて、これはすべて機能しますFilter(null)。と同じように解釈されますが、前者は最初のプロパティとしてすべての s を返し、後者はすべての s をFilter()返すことを意図しています。ItemnullItem

これに対処するためにオーバーロードを定義してみました

public List<Item> Filter(String value)
{
    if(value == null)
        return Filter(new String[] {null});
    else
        return Filter(value);
}

しかし、コンパイラは、Ambiguous Invocation呼び出し時にエラーを表示するだけFilter(null)です。

4

2 に答える 2

2

オーバーロードを削除すると、次のようになります。

Filter(null);

は次のように呼び出されます。

string[] valuesOrdered = null;
Filter(valuesOrdered);

このようではありません:

Filter(new string[] { null });

したがって、これを検出できます。単一の を含む配列を渡したように動作させたい場合はnull、これで十分です。

public List<Item> Filter(params String[] valuesOrdered)
{
    valuesOrdered = valuesOrdered ?? new string[] { null };

    //...
}

これに注意してください:

Filter();

実際には次のように呼び出されます。

Filter(new string[0]);

そのため、検出できる 2 つの違いがあります。

これを示す簡単なLINQPadプログラムを次に示します。

void Main()
{
    Filter();
    Filter(new[] { "a" });
    Filter("a");
    Filter(null);
}

public static void Filter(params string[] values)
{
    values.Dump();
}

出力:

LINQPad 出力

于 2014-02-12T13:09:03.627 に答える
1

構文を使用できます

Filter((String)null)

長さ 1 の配列を使用して、「展開された」形式でメソッドを呼び出します。

その構文が不快な場合は、定数を定義することをお勧めします

const String NullStr = null;

と使用

Filter(NullStr)

代わりは。

PS!個人的にはもっと好きですstringString、あなたの質問とは関係がないので、ここであなたの慣習に固執しました.

于 2014-02-12T13:09:44.733 に答える