Lambda-Kompilierungsfehler, Referenz definiert in '' Bereich, aber nicht definiert

c# expression-trees

Frage

In dem einfachen Ausschnitt unten:

static void Main(string[] args)
{
    Expression<Func<string, bool>> equal = s => s == "test";
    LambdaExpression lambda = Expression.Lambda(equal.Body, Expression.Parameter(typeof(string), "s"));
    lambda.Compile();
}

Die Kompiliermethode schlägt mit einer InvalidOperationException

"Variable 's' vom Typ 'System.String' referenziert vom Gültigkeitsbereich '', aber es ist nicht definiert".

Während ich andere ähnliche Fragen gefunden habe, habe ich die Antworten nicht verstanden.

Die DebugView der LambdaExpression enthält Folgendes:

.Lambda #Lambda1<System.Func`2[System.String,System.Boolean]>(System.String $s) {
    $s == "test"
}

Also , wo ich in anderen Beispielen dieser Frage gesehen haben, die Parameter und die Verwendung nicht zusammenpassen, scheint dies kein Problem , hier zu sein. Was mache ich falsch?

Akzeptierte Antwort

Parameter von Lambda-Ausdrücken verwenden keine auf Namen basierende Gleichheit, sie verwenden Referenzgleichheit. In Ihrem Ausdruck haben Sie also zwei völlig verschiedene Parameter namens s , einer ist definiert, wird aber nicht verwendet, der andere wird verwendet, aber nicht definiert.

Also, im Grunde ist Ihr Ausdruck etwas wie s1 => s2 == "test" , weshalb er nicht kompiliert werden kann. Die einfachste Lösung wäre, denselben Parameter zu verwenden, den der ursprüngliche Ausdruck verwendet:

LambdaExpression lambda = Expression.Lambda(equal.Body, equal.Parameters.Single());

Wenn Sie wirklich Ihren eigenen Parameter verwenden möchten, müssten Sie alle Instanzen des ursprünglichen Parameters im Lambda-Body durch Ihren neuen Parameter ersetzen. Der beste Weg dies zu tun, ist ExpressionVisitor zu verwenden.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum