gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:09:07 25 4
gpt4 key购买 nike

我有一个函数

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() 相同的方式,但其目的是前者应返回所有 Item,其第一个为 null属性,后者应返回所有 Item

我试着定义一个重载来处理这个问题

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

但是当我调用 Filter(null) 时,编译器只显示一个 Ambiguous Invocation 错误。

最佳答案

如果你放弃过载,那么:

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[] values)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21728727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com