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