在第3行调用“包含”但没有括号的“构造”的名称是什么?是某种语法糖吗?
string current = "02";
string[] list = {"00", "01", "02", "03", "10"};
if (list.Any(current.Contains)) {
// logic
}
我只是无法弄清楚它为什么起作用,如何工作,又叫什么名字?
答案 0 :(得分:2)
list.Any()
函数将谓词函数用作第一个参数。通常,这是list.Any(s => s == "01")
之类的内联lambda函数,但是由于这个原因,您可以像示例中那样传入正确定义的函数。
s => s == "01"
和current.Contains
具有相同的签名。它们都将字符串作为唯一输入参数,并返回布尔值。因此,它们都可以用作list.Any()
函数中的谓词。
答案 1 :(得分:2)
您可能还记得您可以通过以下方式订阅活动:
top
这是语法糖:
something.SomeEvent += SomeHandler;
这将创建一个新的something.SomeEvent += new EventHandler(SomeHandler);
实例(EventHandler
是委托类型),它使用方法EventHandler
。
类似的事情在这里发生。
SomeHandler
采用list.Any
,这是一个委托类型。因此,您需要向其传递Func<T, bool>
的实例。
写时:
Func<T, bool>
编译器会创建一个新方法(该方法需要一个list.Any(x => current.Contains(x))
,返回一个string
,然后调用bool
),并执行以下操作:
current.Contains
现在,您还可以自己通过显式方法创建list.Any(new Func<string, bool>(GeneratedMethod))
委托实例,就像Func<string, bool>
示例中一样:
EventHandler
或者,您可以不使用list.Any(new Func<string, bool>(current.Contains))
,编译器将为您生成它,就像在前面的示例中一样:
new Func<string, bool>