C# 编译的表达式作为控制台应用程序 ReadLine 未暂停



我试图将 linq 表达式编译为控制台应用程序.exe文件。

以下代码工作正常并暂停:

LambdaExpression expr1 = Expression.Lambda<Action<string[]>>(
Expression.Call(typeof(Console).GetMethod("ReadLine")),
Expression.Parameter(typeof(string[])));

但是,当在另一个 lambda 中进行 lambda 调用时,如下所示:

var parameter = Expression.Parameter(typeof(string[]));
LambdaExpression expr1 = Expression.Lambda<Action<string[]>>(
    Expression.Lambda<Action<string[]>>(
        Expression.Call(typeof(Console).GetMethod("ReadLine")),
        parameter), parameter);

它只是关闭控制台而不暂停。

表达式是通过 AssemblyBuilder 创建一个程序集和一个由 expr1 填充的 MethodBuilder 来编译的。CompileToMethod(methodBuilder(;

嵌套的 lambda 不起作用还是我必须以不同的方式使用它?

编辑:正如@Servy指出的那样,Expression.Lambda只会创建但不执行lambda。

lambda 可以通过以下答案在表达式中执行:如何在 C#/.NET 中使用 LINQ 表达式树调用 lambda

Expression.Invoke(Expression.Constant(innerLambda(, parameter(;

当您编写类似于每个表达式的实际代码时,很容易看到发生了什么。

对于第一个:

Action<string[]> firstDelegate = parameterName => Console.ReadLine();

对于第二个:

Action<string[]> firstDelegate = parameterName => parameterName => Console.Readline();

因此,当您调用第一个委托时,它会从控制台读取一行。 当您调用第二个委托时,它会创建一个新的 lambda,然后不对其执行任何操作。

如果要创建从控制台读取行的委托,则第一个代码段正是您应该如何操作的。 在这种情况下,没有理由在 lambda 中创建 lambda。

最新更新