我有一个函数
public List<Item> Filter(params String[] valuesOrdered)
{
//...
}
充当所有Item
的过滤器。
public class Item
{
List<String> propertiesOrdered;
//...
}
所以如果我打电话,例如Filter("prop1")
,那么所有以 "prop1"
作为其属性第一个条目的 Item
都将被匹配。
如果我调用 Filter()
,则应返回所有 Item
。
我还需要能够匹配 null
值。因此,例如现在我可以调用 Filter(null, null)
,并且所有带有 null, null
的 Item
因为它们的第一个属性将被匹配.
除了我调用 Filter(null)
时,所有这些都有效。它将以与 Filter()
相同的方式进行解释,但其目的是前者应返回所有以 null
作为第一个的 Item
属性,后者应返回所有 Item
。
我尝试定义一个重载来处理这个问题
public List<Item> Filter(String value)
{
if(value == null)
return Filter(new String[] {null});
else
return Filter(value);
}
但是当我调用 Filter(null)
时,编译器只会显示 Ambigously Inspiration
错误。
最佳答案
如果你放弃重载,那么:
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();
}
输出:
关于c# - 是否可以区分什么都没有传递,或者一个 null 传递给 F(params String[] 值)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21728727/