Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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_.net Core_Expression_Expression Trees - Fatal编程技术网

C# 为什么下面的表达式树不编译,除非我们使用块?

C# 为什么下面的表达式树不编译,除非我们使用块?,c#,.net,.net-core,expression,expression-trees,C#,.net,.net Core,Expression,Expression Trees,我有以下表达式树: var collection = Expression.Variable(typeof(string[]), "testVar"); Expression[] arrayElements = new[] { Expression.Constant("helloWorld") }; var arrayInitialization = Expression.NewArrayInit(typeof(string

我有以下表达式树:

var collection = Expression.Variable(typeof(string[]), "testVar");
        Expression[] arrayElements = new[] { Expression.Constant("helloWorld") };
        var arrayInitialization = Expression.NewArrayInit(typeof(string), arrayElements);
        var body = Expression.Assign(collection, arrayInitialization);
        return Expression.Lambda<Func<string[]>>(body).Compile();
var collection=Expression.Variable(typeof(string[]),“testVar”);
表达式[]数组元素=新的[]{Expression.Constant(“helloWorld”)};
var arrayInitialization=Expression.NewArrayInit(typeof(string),arrayElements);
var body=Expression.Assign(集合、数组初始化);
返回表达式.Lambda(body.Compile();
它在最终表达式中抛出一个错误,关于“testVar”超出范围,除非我将return语句更改为以下内容:

return Expression.Lambda<Func<string[]>>(Expression.Block(
            typeof(string[]), new[] { collection }, body)).Compile();
返回Expression.Lambda(Expression.Block(
typeof(string[],new[]{collection},body)).Compile();

有人能解释为什么会这样吗?如果有一种替代方法,可以不使用块,但仍然在表达式树中定义变量?

您想实现什么<代码>()=>{var testVar=new[]{“helloWorld”};}?但是这样的表达式没有多大意义。@Evk基本上你写的东西,我知道它没有意义,我只是想弄清楚当涉及变量时为什么它需要一个块,以及是否确实可以避免它?或者,当涉及变量时,块始终是一项要求?这意味着我们的
表达式.Lambda
将始终需要使用
表达式.Block
?如果要在表达式树中声明局部变量,则必须使用块。这里没有“main block”,因为正则lambda类似于
()=>DoSomething()
(没有花括号),但是如果您想定义局部变量,您将执行类似于
()=>{var testVal=…}
(花括号定义块)的操作。