解決因運算式樹中禁止的運算式所產生的錯誤和警告

本文涵蓋下列編譯器錯誤:

  • CS0765 - 在運算式樹狀架構中,不可使用只具有定義宣告的部分方法或已移除的條件式方法。
  • CS0831 - 運算式樹狀架構不可包含基底存取。
  • CS0832 - 運算式樹狀架構不可包含指派運算子
  • CS0834 - 具有陳述式主體的 Lambda 運算式不可轉換為運算式樹狀架構。
  • CS0835 - 無法將 Lambda 表達式轉換為運算式樹狀架構,因為其型別引數 'type' 不是委派型別。
  • CS0838 - 運算式樹狀架構不可包含多維陣列初始設定式。
  • CS0845 - 運算式樹狀架構 Lambda 不可包含左側為 null 或預設常值的聯合運算子。
  • CS0853 - 運算式樹狀架構不可包含具名引數規格。
  • CS0854 - 運算式樹不可包含使用選擇性引數的呼叫。
  • CS0855 - 運算式樹不可包含索引屬性。
  • CS1944 - 表示式樹不可包含不安全的指標操作。
  • CS1945 - 運算式樹狀架構不可包含匿名方法運算式。
  • CS1946 - 匿名方法運算式不可轉換為運算式樹狀架構。
  • CS1951 - 運算式樹狀架構 Lambda 不可包含 ref、in 或 out 參數。
  • CS1952 - 運算式樹狀架構 Lambda 不可包含具有變數引數的方法。
  • CS1963 - 運算式樹狀架構不可包含動態作業。
  • CS1989 - 非同步 Lambda 運算式不可轉換為運算式樹狀架構。
  • CS2037 - 運算式樹狀架構 Lambda 不可包含引數上省略 ref 的 COM 呼叫。
  • CS7053 - 運算式樹狀架構不可包含「功能」。
  • CS8072 - 運算式樹 Lambda 不可包含 null 傳播運算子。
  • CS8074 - 表示式樹 Lambda 不可包含字典初始化器。
  • CS8075 - 在 Lambda 運算式中的集合初始值設置器不支援擴充 Add 方法。
  • CS8110 - 運算式樹狀架構不可包含區域函式的參考。
  • CS8122 - 運算式樹狀架構不可包含 'is' 模式比對運算子。
  • CS8143 - 運算式樹不可包含元組常值。
  • CS8144 - 運算式樹狀架構不可包含元組轉換。
  • CS8153 - 運算式樹 Lambda 不可包含以參考傳回的方法、屬性或索引子的呼叫。
  • CS8155 - 以參考方式傳回的 Lambda 運算式不可轉換為運算式樹。
  • CS8188 - 運算式樹狀架構不可包含 throw 運算式。
  • CS8198 - 運算式樹不可包含 out 引數變數宣告。
  • CS8207 - 運算式樹狀架構中不得包含丟棄符號(discard)。
  • CS8382 - 運算式樹狀架構不可包含元組 == 或 != 運算子。
  • CS8514 - 運算式樹狀架構不可包含 switch 運算式。
  • CS8640 - 運算式樹不可包含 ref 結構體或受限型別的值。
  • CS8642 - 運算式樹不可包含 null 合併指派。
  • CS8790 - 運算式樹不可包含模式 System.Index 或 System.Range 索引子存取。
  • CS8791 - 運算式樹不可包含 from-end index ('^') 表達式。
  • CS8792 - 運算式樹不可包含區間 ('..') 運算式。
  • CS8810 - 在運算式樹狀架構中,不可使用方法群組上的 '&'。
  • CS8849 - 運算式樹中不可包含 with 運算式。
  • CS8927 - 運算式樹狀架構不可包含靜態虛擬或抽象介面成員的存取。
  • CS8952 - 運算式樹狀架構不可包含差補字串處理常式轉換。
  • CS8972 - 具有屬性的 Lambda 運算式不可轉換為運算式樹狀架構。
  • CS9170 - 運算式樹不可包含內嵌陣列存取或轉換。
  • CS9175 - 運算式樹狀架構不可包含集合運算式。
  • CS9226 - 運算式樹狀架構不得包含非陣列 params 集合參數的展開形式。
  • CS9296 - 表達式樹不得包含擴充屬性或索引器存取
  • CS9307 - 表達式樹不可包含不正確位置中的命名引數指定。
  • CS9369 - 表達式樹不得包含聯集轉換。

運算式樹狀架構限制

前面列表中的所有錯誤都顯示你使用了在運算式樹狀架構中不允許的 C# 表達式型別。 大部分情況下,禁止的運算式代表 C# 3.0 之後引進的語法。 會禁止這些運算式是因為,若允許這些運算式,將會在剖析運算式樹狀架構的所有程式庫中建立中斷性變更。 如果允許較新的建構,就必須增強所有程式庫才能剖析新的 C# 運算式。

禁止的運算式如下:

其他限制如下:

  • 無法將擴充屬性和索引子當作擴充成員來存取。
  • 無法對 lambda 運算式、其參數或回傳套用屬性。
  • Lambda 運算式必須可轉換為衍生自 System.Linq.Expressions.Expression (其型別參數為委派型別) 的型別。
  • 受限的 命名參數和可選參數。 運算式不可呼叫指定具名引數的方法,而且不可使用選擇性參數的預設值。
  • 無法使用 字典初始化器 或擴充 Add 方法。
  • 目標運算式必須是 Lambda 運算式。 不允許常數和變數,但允許傳回常數或變數的 Lambda 運算式。
  • 不允許不安全的指標操作。
  • COM 呼叫必須在引數上包含 ref;不能將其隱含。
  • 不支援的 __arglist 關鍵字。