C# 解释expression.Compile()中的两对括号()

C# 解释expression.Compile()中的两对括号(),c#,.net,asp.net-web-api,C#,.net,Asp.net Web Api,你能解释一下这个奇怪的代码是干什么的吗 expression.Compile()(); 为什么这里有两对括号?我在谷歌上什么也没找到。完整的方法是 public Validator NotEmpty(Expression<Func<IEnumerable<T>>> expression) { var member = (MemberExpression)expression.Body; string propertyName = member

你能解释一下这个奇怪的代码是干什么的吗

expression.Compile()();
为什么这里有两对括号?我在谷歌上什么也没找到。完整的方法是

public Validator NotEmpty(Expression<Func<IEnumerable<T>>> expression)
{
    var member = (MemberExpression)expression.Body;
    string propertyName = member.Member.Name;
    IEnumerable<T> value = expression.Compile()();

    if (value == null || !value.Any())
    {
        ValidationResult.AddError(propertyName, "Shouldn't be empty");
    }
    return this;
}
公共验证程序NotEmpty(表达式)
{
var member=(MemberExpression)expression.Body;
字符串propertyName=member.member.Name;
IEnumerable value=expression.Compile();
if(value==null | |!value.Any())
{
AddError(propertyName,“不应为空”);
}
归还这个;
}
它是这样使用的:

_validator.NotEmpty(() => request.PersonIds);  // request.PersonIds is List<int>
\u validator.NotEmpty(()=>request.PersonIds);//request.PersonIds是列表

此方法检查集合是否为空或null。一切正常,但我对代码有点困惑。我以前从未见过在C#中使用两对括号。这是什么意思?

好吧,将int列表作为表达式树传递到方法中。此表达式生成
IEnumerable
(在本例中为
IEnumerable
)的值

要获取表达式的值,需要将此表达式编译为委托
Func
,然后调用委托。 事实上,我可以编写两行独立的代码,而不是上面使用的较短语法:

Func<IEnumerable<T>> del = expression.Compile();
IEnumerable<T> value = del();
Func del=expression.Compile();
IEnumerable value=del();
两个括号()实际上是调用方法或委托的运算符。看

表达式“expression.Compile()”似乎传递了一个可以调用的委托。然后,第二对括号调用此委托

您也可以将其改写为:

var del = expression.Compile();
del();

调用编译后的
Func
表达式。仅供参考:第二对
()
.Invoke()的缩写因此该行等价于:
expression.Compile().Invoke()