解決運算式樹狀架構中禁止的運算式所產生的錯誤和警告
本文涵蓋下列編譯器錯誤:
- CS0765 - 在運算式樹狀架構中,不可使用只具有定義宣告的部分方法或已移除的條件式方法。
- CS0831 - 運算式樹狀架構不可包含基底存取。
- CS0832 - 運算式樹狀架構不可包含指派運算子
- CS0834 - 具有陳述式主體的 Lambda 運算式不可轉換為運算式樹狀架構。
- CS0835 - 如果運算式樹狀架構的型別引數 'type' 不是委派型別,無法將 Lambda 轉換為運算式樹狀架構。
- CS0838 - 運算式樹狀架構不可包含多維陣列初始設定式。
- CS0845 - 運算式樹狀架構 Lambda 不可包含左側為 null 或預設常值的聯合運算子。
- CS0853 - 運算式樹狀架構不可包含具名引數規格。
- CS0854 - 運算式樹狀架構不可包含使用選擇性引數的呼叫或叫用。
- CS0855 - 運算式樹狀架構不可包含具備索引的屬性。
- CS1944 - 運算式樹狀架構不可包含 unsafe 指標作業。
- 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 - 運算式樹狀架構不可包含 range ('
..
') 運算式。 - CS8810 - 在運算式樹狀架構中,不可使用方法群組上的 '
&
'。 - CS8849 - 運算式樹狀架構不可包含
with
運算式。 - CS8927 - 運算式樹狀架構不可包含靜態虛擬或抽象介面成員的存取。
- CS8952 - 運算式樹狀架構不可包含差補字串處理常式轉換。
- CS8972 - 具有屬性的 Lambda 運算式不可轉換為運算式樹狀架構。
- CS9170 - 運算式樹狀架構不可包含內嵌陣列存取或轉換。
- CS9175 - 運算式樹狀架構不可包含集合運算式。
- CS9226 - 運算式樹狀架構不得包含非陣列 params 集合參數的展開形式。
運算式樹狀架構限制
上述清單中的所有錯誤都表示您已使用運算式樹狀架構中不允許的 C# 運算式型別。 大部分情況下,禁止的運算式代表 C# 3.0 之後引進的語法。 會禁止這些運算式是因為,若允許這些運算式,將會在剖析運算式樹狀架構的所有程式庫中建立中斷性變更。 如果允許較新的建構,就必須增強所有程式庫才能剖析新的 C# 運算式。
禁止的運算式如下:
- 叫用沒有實作宣告的部分方法。
- 叫用已移除的條件式方法。
- 叫用區域函式。
- 不允許
async
Lambda 運算式。 - 使用
base
存取直接呼叫基底類別中宣告的虛擬方法。 - 指派作業。
- 不允許陳述式 Lambda。
- 多維陣列初始設定式。 相反地,您必須在運算式樹狀架構之外建立和初始化多維陣列。
- 不允許
dynamic
作業。 - 不允許模式比對運算式。
- 不允許元組常值和許多元組作業,例如相等比較。
- 不允許
throw
運算式。 - discard (
_
) 宣告。 - 不允許索引和範圍運算子。
- 不允許使用
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
關鍵字。