解决表达式树中禁止的表达式生成的错误和警告

本文介绍以下编译器错误:

  • CS0765 - 不能在表达式树中使用只有定义声明的分部方法或已移除的条件方法。
  • CS0831 - 表达式树不能包含基访问。
  • CS0832 - 表达式树不能包含赋值运算符。
  • CS0834 - 无法将具有语句体的 lambda 表达式转换为表达式树。
  • CS0835 - 无法将 lambda 转换为其类型实参“type”不是委托类型的表达式树。
  • CS0838 - 表达式树不能包含多维数组初始值设定项。
  • CS0845 - 表达式树 lambda 不能包含左侧为 null 或 default 字面量的合并运算符。
  • CS0853 - 表达式树不能包含命名参数规范。
  • CS0854 - 表达式树不能包含使用可选参数的调用。
  • CS0855 - 表达式树不能包含索引属性。
  • CS1944 - 表达式树不能包含不安全的指针操作。
  • CS1945 - 表达式树不能包含匿名方法表达式。
  • CS1946 - 无法将匿名方法表达式转换为表达式树。
  • CS1951 - 表达式树 lambda 不能包含 refinout 参数。
  • 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.IndexSystem.Range 索引器访问。
  • CS8791 - 表达式树不能包含 from-end 索引(“^”)表达式。
  • CS8792 - 表达式树不能包含范围(“..”)表达式。
  • CS8810 - 不能在表达式树中使用方法组上的“&”。
  • CS8849 - 表达式树不能包含 with 表达式。
  • CS8927 - 表达式树不能包含静态虚拟或抽象接口成员的访问权限。
  • CS8952 - 表达式树不能包含内插字符串处理程序转换。
  • CS8972 - 无法将具有属性的 lambda 表达式转换为表达式树。
  • CS9170 - 表达式树不能包含内联数组访问或转换。
  • CS9175 - 表达式树不能包含集合表达式。
  • CS9226 - 表达式树可能不包含非数组 params 集合参数的扩展形式。
  • CS9296 - 表达式树可能不包含扩展属性访问
  • CS9307 - 表达式树不能包含位置不当的命名参数规范

表达式树限制

前面列表中的所有错误都表明你使用了表达式树中不允许的 C# 表达式类型。 大多数情况下,禁止的表达式代表 C# 3.0 之后引入的语法。 这些表达式被禁止是因为允许它们会在分析表达式树的所有库中造成中断性变更。 如果允许较新的构造,则所有库都需要增强以分析新的 C# 表达式。

禁止使用以下表达式:

其他限制包括:

  • 无法将扩展属性作为扩展进行访问。
  • 属性不能应用于 lambda 表达式、其参数或返回。
  • lambda 表达式必须可转换为从 System.Linq.Expressions.Expression(其类型参数是委托类型)派生的类型。
  • 命名参数和可选参数受到限制。 该表达式无法调用指定命名参数的方法,也不能使用可选参数的默认值。
  • 不允许使用字典初始值设定项。 两者都不是扩展 Add 方法。
  • 目标表达式必须是 Lambda 表达式。 不允许使用常量和变量,但可以使用返回常量或变量的 Lambda 表达式。
  • 不允许不安全的指针操作。
  • COM 调用必须在参数上包含 ref;不能隐含。
  • 不允许使用不受支持的 __arglist 关键字。