Pourquoi ai-je une exception de référence null dans cet arbre d'expression?

.net c# c#-4.0 expression-trees lambda

Question

J'ai une expression d'arbre qui ressemble à ceci:

.Block(
    System.Object $instance,
    MyType2 $result) {
    $result = (MyType2)((MyType1)$instance).Property1;
    .Goto return { };
    .Label
    .LabelTarget useDefault:;
    $result = .Default(MyType2);
    .Label
    .LabelTarget return:;
    $result
}

Voici les types personnalisés utilisés dans l'arbre des expressions:

.Block(
    System.Object $instance,
    MyType2 $result) {
    $result = (MyType2)((MyType1)$instance).Property1;
    .Goto return { };
    .Label
    .LabelTarget useDefault:;
    $result = .Default(MyType2);
    .Label
    .LabelTarget return:;
    $result
}

Enfin, voici comment je construis, compile et appelle l'arborescence des expressions (cela ne fonctionnera pas exactement de la même manière car j'ai oublié du code pour simplifier les choses):

.Block(
    System.Object $instance,
    MyType2 $result) {
    $result = (MyType2)((MyType1)$instance).Property1;
    .Goto return { };
    .Label
    .LabelTarget useDefault:;
    $result = .Default(MyType2);
    .Label
    .LabelTarget return:;
    $result
}

L'appel lève toutefois l'exception suivante:

La référence d'objet n'est pas définie à une instance d'un objet. à lambda_method (Closure, Object)

Je pense que cela se produit à cause de $result = (MyType2)((MyType1)$instance).Property1; affectation, mais je ne comprends pas pourquoi, car l'instance transmise à l'expression n'est pas null .

Réponse acceptée

Le fait que:

ParameterExpression parameter = Expression.Variable(typeof(object));

Est défini après tout le corps devrait être la clé; essentiellement, vous ne regardez même pas l'objet que vous passez; vous ne faites que regarder instanceParameter , qui est (dans votre code) simplement une variable non affectée.

En gros, supprimez la dernière déclaration de parameter et ne déclarez pas instanceParameter tant que variable:

ParameterExpression parameter = Expression.Variable(typeof(object));



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi