本文介绍以下编译器错误:
- CS0765 - 不能在表达式树中使用只有定义声明的分部方法或已移除的条件方法。
- CS0831 - 表达式树不能包含基访问。
- CS0832 - 表达式树不能包含赋值运算符。
- CS0834 - 无法将具有语句体的 lambda 表达式转换为表达式树。
- CS0835 - 无法将 lambda 转换为其类型实参“type”不是委托类型的表达式树。
- CS0838 - 表达式树不能包含多维数组初始值设定项。
- CS0845 - 表达式树 lambda 不能包含左侧为 null 或 default 字面量的合并运算符。
- CS0853 - 表达式树不能包含命名参数规范。
- CS0854 - 表达式树不能包含使用可选参数的调用。
- CS0855 - 表达式树不能包含索引属性。
- CS1944 - 表达式树不能包含不安全的指针操作。
- CS1945 - 表达式树不能包含匿名方法表达式。
- CS1946 - 无法将匿名方法表达式转换为表达式树。
-
CS1951 - 表达式树 lambda 不能包含
ref
、in
或out
参数。 - CS1952 - 表达式树 lambda 不能包含具有变量参数的方法。
- CS1963 - 表达式树不能包含动态操作。
- CS1989 - 异步 lambda 表达式无法转换为表达式树。
- CS2037 - 表达式树 lambda 不能包含参数中省略 ref 的 COM 调用。
- CS7053 - 表达式树可能不包含“feature”。
- CS8072 - 表达式树 lambda 不能包含空传播运算符。
- CS8074 - 表达式树 lambda 不能包含一个字典初始值设定项。
-
CS8075 - 表达式 Lambda 中的集合初始值设定项不支持扩展
Add
方法。 - CS8110 - 表达式树不能包含对本地函数的引用。
-
CS8122 - 表达式树不能包含“
is
”模式匹配运算符。 - CS8143 - 表达式树不能包含元组字面量。
- CS8144 - 表达式树不能包含元组转换。
- CS8153 - 表达式树 lambda 不能包含对按引用返回的方法、属性或索引器的调用。
- CS8155 - 引用返回的 Lambda 表达式不能转换为表达式树。
- CS8188 - 表达式树不能包含 throw 表达式。
- CS8198 - 表达式树不能包含输出参数变量声明。
- CS8207 - 表达式树不能包含放弃。
-
CS8382 - 表达式树不能包含元组
==
或!=
运算符。 - CS8514 - 表达式树不能包含 switch 表达式。
- CS8640 - 表达式树不能包含 ref 结构或受限类型的值。
- CS8642 - 表达式树不能包含 null 合并赋值。
- CS8790 - 表达式树不能包含模式 System.Index 或 System.Range 索引器访问。
-
CS8791 - 表达式树不能包含 from-end 索引(“
^
”)表达式。 -
CS8792 - 表达式树不能包含范围(“
..
”)表达式。 -
CS8810 - 不能在表达式树中使用方法组上的“
&
”。 -
CS8849 - 表达式树不能包含
with
表达式。 - CS8927 - 表达式树不能包含静态虚拟或抽象接口成员的访问权限。
- CS8952 - 表达式树不能包含内插字符串处理程序转换。
- CS8972 - 无法将具有属性的 lambda 表达式转换为表达式树。
- CS9170 - 表达式树不能包含内联数组访问或转换。
- CS9175 - 表达式树不能包含集合表达式。
- CS9226 - 表达式树可能不包含非数组 params 集合参数的扩展形式。
- CS9296 - 表达式树可能不包含扩展属性访问。
- CS9307 - 表达式树不能包含位置不当的命名参数规范。
表达式树限制
前面列表中的所有错误都表明你使用了表达式树中不允许的 C# 表达式类型。 大多数情况下,禁止的表达式代表 C# 3.0 之后引入的语法。 这些表达式被禁止是因为允许它们会在分析表达式树的所有库中造成中断性变更。 如果允许较新的构造,则所有库都需要增强以分析新的 C# 表达式。
禁止使用以下表达式:
- 调用没有实现声明的分部方法。
- 调用已删除的条件方法。
- 调用本地函数。
- 不允许使用
async
lambda 表达式。 - 使用
base
访问权限直接调用基类中声明的虚拟方法。 - 赋值操作。
- 不允许语句 lambda。
- 多维数组初始值设定项。 必须改为在表达式树外部创建并初始化一个多维数组。
- 不允许
dynamic
操作。 - 不允许模式匹配表达式。
- 不允许使用元组字面量和许多元组操作,例如比较是否相等。
- 不允许
throw
表达式。 -
放弃 (
_
) 声明。 - 不允许使用索引和范围运算符。
- 不允许使用
with
表达式进行非破坏性修改。 - 不能声明或访问内联数组。
- 不能包含集合表达式。
- 不允许使用 null 传播和 null 合并运算符。
- 不允许使用
ref struct
类型,例如 System.Span<T> 和 System.ReadOnlySpan<T>。 - 不允许使用
in
、out
和ref
参数(包括out
变量声明)。 - 不允许
ref
返回 。 - 不允许调用由
ref
返回的方法。 - 无法访问静态抽象接口成员。
- 内联数组。
-
params
修饰符仅可用于一维数组。 不允许使用其他集合类型。
其他限制包括:
- 无法将扩展属性作为扩展进行访问。
- 属性不能应用于 lambda 表达式、其参数或返回。
- lambda 表达式必须可转换为从 System.Linq.Expressions.Expression(其类型参数是委托类型)派生的类型。
- 命名参数和可选参数受到限制。 该表达式无法调用指定命名参数的方法,也不能使用可选参数的默认值。
- 不允许使用字典初始值设定项。 两者都不是扩展
Add
方法。 - 目标表达式必须是 Lambda 表达式。 不允许使用常量和变量,但可以使用返回常量或变量的 Lambda 表达式。
- 不允许不安全的指针操作。
- COM 调用必须在参数上包含
ref
;不能隐含。 - 不允许使用不受支持的
__arglist
关键字。