C# 使用表达式.Block编译的委托一直引发NullReferenceException

C# 使用表达式.Block编译的委托一直引发NullReferenceException,c#,.net,.net-4.0,lambda,expression,C#,.net,.net 4.0,Lambda,Expression,我试图构建一个表达式,为给定对象分配多个属性,但在调用编译委托后,它会从lambda的主体中不断抛出NullReferenceException: var a=Expression.Parameter(类型为(a),“a”); var b=表达式参数(类型为(b),“b”); var c=表达式参数(类型为(c),“c”); LabelTarget returnTarget=Expression.Label(typeof(A)); GotoExpression返回表达式= Return(retu

我试图构建一个表达式,为给定对象分配多个属性,但在调用编译委托后,它会从lambda的主体中不断抛出
NullReferenceException

var a=Expression.Parameter(类型为(a),“a”);
var b=表达式参数(类型为(b),“b”);
var c=表达式参数(类型为(c),“c”);
LabelTarget returnTarget=Expression.Label(typeof(A));
GotoExpression返回表达式=
Return(returnTarget,a,typeof(a));
LabelExpression returnLabel=Expression.Label(
returnTarget,Expression.Constant(null,typeof(A));
var expression=expression.Lambda(
表达式块(
(A)的类型,
新[]{a,b,c},
表达式.赋值(
Expression.Property(a,typeof(a).GetProperty(“B”),
b) ,,
表达式.赋值(
Expression.Property(a,typeof(a).GetProperty(“C”),
c) ,,
返回表达式,
退货标签
), 
a、 b、c);
Func Func=expression.Compile();
//调用func会引发NullReferenceException
结果=func(新的A(),新的B(),新的C());

我假设我写的
表达式.Block
不正确,但我到底做错了什么?

您应该替换该行

new[] { a, b, c },


Expression.Block
的第二个参数应该定义块作用域变量,但您已经在
Expression.Lambda的最后一个参数中提供了参数a、b和c作为函数级参数。您应该替换该行

new[] { a, b, c },


Expression.Block
的第二个参数应该定义块作用域变量-但是您已经在
Expression.Lambda的最后一个参数中提供了参数a、b和c作为函数级参数。知道哪一行引发异常会很有用。@Jon:请参阅最后一行的注释:“//调用func会引发NullReferenceException“。还要注意,包括堆栈跟踪不会提供额外的信息。调用堆栈在生成的lambda中结束。是的,但至少您可以尝试注释一些内容,以快速查明罪魁祸首。这不是一个很大的lambda。@Jon:我已经尽了最大努力将其最小化。赋值失败,可能是因为参数“a”的值为null。了解哪一行引发异常会很有用。@Jon:请参阅我在最后一行的评论://调用func引发NullReferenceException”。还要注意,包括堆栈跟踪不会提供额外的信息。调用堆栈在生成的lambda中结束。是的,但至少您可以尝试注释一些内容,以快速查明罪魁祸首。这不是一个大λ。@Jon:我已经尽了最大努力来最小化它。赋值失败了,大概是因为参数“a”的值为空。