5 Stimmen

Lambda-Kompilierfehler, Bezug in ''-Bereich definiert, ist aber nicht definiert

In dem einfachen Snippet unten:

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

Die Compile-Methode schlägt mit einer InvalidOperationException fehl

"Variable 's' des Typs 'System.String', die aus dem Bereich referenziert wird, ist nicht definiert".

Obwohl ich andere ähnliche Fragen gefunden habe, konnte ich die Antwort nicht verstehen.

Der DebugView der LambdaExpression enthält dies:

.Lambda #Lambda1(System.String $s) {
    $s == "test"
}

Also, wo ich bei anderen Beispielen dieser Frage gesehen habe, dass der Parameter und die Verwendung nicht übereinstimmen, scheint dies hier kein Problem zu sein. Was mache ich falsch?

9voto

svick Punkte 224493

Die Parameter von Lambda-Ausdrücken verwenden keine Gleichheit basierend auf Namen, sie verwenden Referenzgleichheit. Also haben Sie in Ihrem Ausdruck zwei vollständig verschiedene Parameter namens s, einer ist definiert, aber nicht verwendet, der andere wird verwendet, ist aber nicht definiert.

Also ist im Grunde genommen Ihr Ausdruck so etwas wie s1 => s2 == "test", deshalb kann er nicht kompiliert werden. Die einfachste Lösung wäre, den gleichen Parameter zu verwenden, den der Originalausdruck verwendet:

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

Wenn Sie wirklich Ihren eigenen Parameter verwenden wollten, müssten Sie alle Instanzen des Originalparameters im Lambda-Body durch Ihren neuen Parameter ersetzen. Wahrscheinlich ist der beste Weg, dies zu tun, die Verwendung von ExpressionVisitor.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X