Contains 方法必须使用 () 吗?

Is it necessary to use () with the Contains method?

我有这样的代码:

string target = ListOfTabs.FirstOrDefault(e.Target.Location.OriginalString.Contains);

我没有编写代码,我正在尝试了解它的作用。我看到有一个方法叫做Contains(),但是这里不明白为什么Contains后面没有()。这是不同的东西吗?有人可以解释这段代码的作用吗?

你不需要它,因为 FirstOrDefault 在参数中有一个 Func。由于 Contains 匹配请求的类型,您可以像将任何参数传递给任何其他函数一样传递 Contains

FirstOrDefault 的签名是:

public static TSource FirstOrDefault<TSource> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,bool> predicate);

你习惯写:

var target = ListOfTabs.FirstOrDefault(x => e.Target.Location.OriginalString.Contains(x));

相同
Func<string, bool> predicate = x => e.Target.Location.OriginalString.Contains(x);
var target = ListOfTabs.FirstOrDefault(predicate);

相同
Func<string, bool> predicate = e.Target.Location.OriginalString.Contains;
var target = ListOfTabs.FirstOrDefault(predicate);

到时候可以直接传Contains

var target = ListOfTabs.FirstOrDefault(e.Target.Location.OriginalString.Contains);

FirstOrDefault 接受一个 Func<TSource, bool> 作为参数。

通常这是一个 lambda 表达式,但由于 string.Contains 可以转换为 Func<string, bool>,它可以直接传递给方法(假设 ListOfTabsIEnumerable<string>).

FirstOrDefault的执行中,会使用()语法来实际执行string.Contains

FirstOrDefault 基本上将函数作为参数。写作

ListOfTabs.FirstOrDefault(e.Target.Location.OriginalString.Contains);

写法几乎一样

ListOfTabs.FirstOrDefault(x => e.Target.Location.OriginalString.Contains(x));

Containsx => Contains(x)都是函数,所以可以!