2

我有一个功能

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

它充当所有Items 的过滤器。

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

因此,如果我调用 eg Filter("prop1"),那么所有作为第一个条目的Items"prop1"都将匹配它们的属性。

如果我调用,则应返回Filter()所有s 。Item

我还需要能够匹配null值。因此,例如现在我可以调用Filter(null, null)所有Itemsnull, null作为它们的第一个属性将被匹配。

除了我打电话时,所有这些都有效Filter(null)。它将以与 相同的方式解释Filter(),但意图是前者应返回所有Itemsnull作为其第一个属性,而后者应返回所有Items。

我尝试定义一个重载来处理这个

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]);

因此,您可以检测到两者之间的差异。

这是一个简单的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)

使用长度为一的数组以“扩展”形式调用该方法。

如果您不喜欢该语法,您可能需要定义一个常量

const String NullStr = null;

并使用

Filter(NullStr)

反而。

PS!我个人更喜欢stringString但我在这里坚持你的约定,因为它与你的问题无关。

于 2014-02-12T13:09:44.733 回答