Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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#_Expression Trees - Fatal编程技术网

表达式树是C#的核心语言特性吗?

表达式树是C#的核心语言特性吗?,c#,expression-trees,C#,Expression Trees,表达式树是BCL对象/库的核心语言功能还是功能?如果没有C#的核心语言特性,你就无法构建它吗 不,表达式树不是语言功能。它们可以从任何.NET语言中使用,因此它们不能是特定于C语言的。它们是在内置程序集中定义的普通CLR类型 通过lambda表达式(和LINQ)的构造是C#特有的。但您始终可以手动构造等效的表达式。C#编译器本身只是发出对众所周知的表达式静态构造方法的调用。您可以使用配置为旧.NET版本的Reflector对二进制文件进行反编译,从而检查编译器发出的内容 表达式树是否使用.NET

表达式树是BCL对象/库的核心语言功能还是功能?如果没有C#的核心语言特性,你就无法构建它吗

不,表达式树不是语言功能。它们可以从任何.NET语言中使用,因此它们不能是特定于C语言的。它们是在内置程序集中定义的普通CLR类型

通过lambda表达式(和LINQ)的构造是C#特有的。但您始终可以手动构造等效的
表达式。C#编译器本身只是发出对众所周知的
表达式
静态构造方法的调用。您可以使用配置为旧.NET版本的Reflector对二进制文件进行反编译,从而检查编译器发出的内容


表达式树是否使用.NET Framework内部API是一个不相关的问题,但我想不出它们需要使用的任何原因。

正如您从
表达式
类定义中看到的,它是在
系统.Linq.Expressions
命名空间中定义的。这个表达式不是C语言的特性——它是所有面向CLR的语言都可以使用的类


例如,这里有一篇关于MSDN的文章,标题为“说明如何使用C#和VB.NET创建和使用表达式树。

在某种程度上,编译器必须在编译时执行从
Func
形式的lambda到
Expression
的隐式转换,我想是的。您可以使用生成器方法,而不是将lambda表达式转换为表达式树。但它要详细得多。@Christopherraris两者都不是。表达式lambda可以用作
表达式
Func
@christopherris。当然,您可以将
表达式
转换为
Func
。我指的是编译器将
(int x)=>3*x+2
转换为表达式树的能力。@Christopherraris:不存在这种隐式转换。(除了
Compile()
方法,这不是魔术)“不,它们不是一种语言功能。它们可以从任何.NET语言中使用,因此它们不能是特定于C语言的。”-这是不对的。它们是C#的语言特征。。。和F#。。。和Visual Basic…---每个人都需要知道语言语法等,才能从源文件中的文本实际创建表达式树。@Timothy:不,您指的是lambda表达式。这些是语言的特点。
表达式
类本身就是常规的.NET类。任何可以使用.NET类的东西都可以使用
表达式
类。@JeffMercado哦……对了。我认为最初的问题是关于lambda表达式到-
expression
特性,而不是
expression
类本身。是的,这些不是语言功能。:)在VB中,表达式树也可以从lambdas构建,只是使用不同的语法。表达式类是.NET framework的一部分这一事实并不能将其排除在语言范围之外。正如@timothyshiels在comments部分中提到的,存在从lambda表达式到表达式类型的隐式转换,这是您无法使用自定义类的。我不会说它是一个核心语言特性,但它与编译器有着内在的联系。foreach在
GetEnumerator
上也是如此,集合初始值设定项sugar用于
Add
IEnumerable
s的方法,
使用
子句用于
IDisposable
s,可以抛出
异常
s,
属性
类等。