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++ - 模板类表达式参数重载

c# - asp.net检查重复并将数据插入sql

c++ - 函数重载和模板

c# - 启用环绕的线性旋转木马

scala - 如果我在 Scala 中定义多个重载构造函数,我不能定义默认值吗?

mysql - 如何使用参数进行过滤但保留 NULL?

javascript - 如何创建带有未定义参数的 JavaScript 函数?

php - 是否可以对具有串联变量的查询进行参数化?

c# - 带有 TLS 的假 smtp 服务器

c# - 在 asp.net 中是否有替代 <br/> 的方法?