c# - 是否可以区分什么都没有传递,或者一个 null 传递给 F(params String[] 值)?

标签 c# overloading parameters params-keyword

我有一个函数

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, nullItem 因为它们的第一个属性将被匹配.

除了我调用 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();
}

输出:

LINQPad output

关于c# - 是否可以区分什么都没有传递,或者一个 null 传递给 F(params String[] 值)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21728727/

相关文章:

c# - 在 LINQ 查询中创建 DateTime

c++ - 何时重载按引用传递(左值和右值)优于按值传递?

python - 如何自动设置 pytest.param id?

javascript - 使用 Val() 作为参数时返回对象而不是字符串

c# - Visual Studio 2012 与 Visual Studio 2010 的比较(增量)

c# - 我们在C#中有非托管资源吗?

c# - 带参数的 UserControl 构造函数

c++ - string_t from(wstring OR string) when string_t 也可以是两者的类型定义

grails - 相对 URL 到服务器路径的转换 - Grails