Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在此表达式树中会出现空引用异常?_C#_.net_C# 4.0_Lambda_Expression Trees - Fatal编程技术网

C# 为什么在此表达式树中会出现空引用异常?

C# 为什么在此表达式树中会出现空引用异常?,c#,.net,c#-4.0,lambda,expression-trees,C#,.net,C# 4.0,Lambda,Expression Trees,我有一个树表达式,如下所示: .Block( System.Object $instance, MyType2 $result) { $result = (MyType2)((MyType1)$instance).Property1; .Goto return { }; .Label .LabelTarget useDefault:; $result = .Default(MyType2); .Label .LabelTar

我有一个树表达式,如下所示:

.Block(
    System.Object $instance,
    MyType2 $result) {
    $result = (MyType2)((MyType1)$instance).Property1;
    .Goto return { };
    .Label
    .LabelTarget useDefault:;
    $result = .Default(MyType2);
    .Label
    .LabelTarget return:;
    $result
}
以下是表达式树中使用的自定义类型:

public class MyType1
{
    public MyType2 Property1 { get; set; }
}

public class MyType2
{
}
最后,这是我构建、编译和调用表达式树的方式(它不会像这样运行,因为我省略了一些代码来简化事情):

objectinstance=newmytype1();
表达式=…//n=>n.属性1
ParameterExpression instanceParameter=表达式.变量(
类型(对象),“实例”);
ParameterExpression resultVariable=表达式.变量(
类型(MyType2),“结果”);
LabelTarget useDefaultLabel=Expression.Label(“useDefault”);
labelTargetReturnLabel=Expression.Label(“return”);
List targetFragments=new List();
MemberInfo MemberInfo=(MemberInfo)expression.Body.Member;
MemberExpression member=ConstantExpression.MakeMemberAccess(
Expression.Convert(instanceParameter、memberInfo.DeclaringType),
会员信息);
targetFragments.Add(
表达式.赋值(
结果可变,
Expression.Convert(成员,typeof(MyType2));
Add(Expression.Goto(returnLabel));
Add(Expression.Label(useDefaultLabel));
targetFragments.Add(表达式)Assign(resultVariable,
Expression.Default(typeof(MyType2));
Add(Expression.Label(returnLabel));
targetFragments.Add(resultVariable);
Expression finalExpression=Expression.Block(
新[]{instanceParameter,resultVariable},
目标碎片);
ParameterExpression参数=Expression.Variable(typeof(object));
MyType2结果=表达式.Lambda(表达式,参数)
.Compile()(实例);
但是,调用会引发以下异常:

对象引用未设置为对象的实例。在lambda_方法(闭包,对象)

我认为这是因为
$result=(MyType2)((MyType1)$instance)赋值,但我不明白为什么,因为传递给表达式的实例不是
null

事实:

ParameterExpression parameter = Expression.Variable(typeof(object));
是定义之后所有的身体都应该是线索;从本质上讲,你根本就不看你传入的对象;您只查看
instanceParameter
,它(在您的代码中)只是一个未赋值变量

基本上,删除最后的
参数
声明,不要将
instanceParameter
声明为变量:

Expression finalExpression = Expression.Block(
    new[] { resultVariable },
    targetFragments);

MyType2 result = Expression.Lambda<Func<object, MyType2>>(
      finalExpression, instanceParameter).Compile()(instance);
Expression finalExpression=Expression.Block(
新[]{resultVariable},
目标碎片);
MyType2结果=表达式.Lambda(
finalExpression,instanceParameter).Compile()(实例);

谢谢,马克,这就成功了。我确信编译器无法区分传递的参数(如果我传递了其他参数),因此我将
instanceParameter
添加到块中。但是现在我从
Func
类型参数中看到了它的明显功能。再次感谢您的帮助。这个问题与我正在写的一篇博文密切相关,我对这篇博文感兴趣。
Expression finalExpression = Expression.Block(
    new[] { resultVariable },
    targetFragments);

MyType2 result = Expression.Lambda<Func<object, MyType2>>(
      finalExpression, instanceParameter).Compile()(instance);