解決延伸模組成員宣告中的錯誤和警告

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

  • CS1100方法具有參數修飾詞 'this',而該修飾詞不在第一個參數上
  • CS1101參數修飾詞 'ref' 不能與 'this' 搭配使用。
  • CS1102參數修飾詞 'out' 不能與 'this' 搭配使用。
  • CS1103擴充方法的第一個參數不能是指針類型。
  • CS1105擴充方法必須是靜態的。
  • CS1106擴充方法必須在非泛型靜態類別中定義。
  • CS1109擴充方法必須在最上層靜態類別上定義,'name' 是巢狀類別。
  • CS1110無法定義新的擴充功能,因為找不到編譯程式所需的類型 ExtensionAttribute 。您是否遺漏 System.Core.dll的參考?
  • CS1112請勿使用 'ExtensionAttribute'。請改用 『this關鍵詞。
  • CS1113在實值型別上定義的擴充方法無法用來建立委派。
  • CS1743無法指定 'this' 參數的預設值。
  • CS9281延伸模組宣告可能沒有名稱。
  • CS9282延伸模組宣告只能包含方法或屬性。
  • CS9283延伸模組必須在最上層、非泛型、靜態類別中宣告。
  • CS9284延伸模組的接收者參數不能有預設值。
  • CS9285擴充容器只能有一個接收者參數。
  • CS9287接收者參數不能與擴充容器類型參數同名。
  • CS9288參數、局部變數或區域函式不能與擴充容器類型參數同名。
  • CS9289成員類型參數的名稱與擴充容器類型參數相同。
  • CS9290參數、局部變數或局部函數不能與擴充參數同名。
  • CS9291value:自動產生的參數名稱與擴充參數名稱衝突。
  • CS9292類型參數的名稱與擴充參數相同。
  • CS9293無法在此內容中使用擴充參數。
  • CS9294'value:自動產生的參數名稱與擴充類型參數名稱衝突。
  • CS9295擴充類型必須參考延伸模組所宣告的所有類型參數,但不會參考類型參數。
  • CS9300延伸模組區塊的 'ref' 接收者參數必須是實值型別或受限於結構的泛型型別。
  • CS9301延伸的 'in' 或 'ref readonly' 接收者參數必須是具體 (非泛型) 實值型別。
  • CS9302延伸模組區塊中宣告的新受保護成員。
  • CS9303無法使用未命名的接收者參數宣告擴充區塊中的實例成員。
  • CS9304無法在擴充區塊中宣告 init 專用存取子。
  • CS9305無法在擴充區塊的未命名接收者參數上使用修飾詞。
  • CS9306類型和別名不能命名為「延伸模組」。
  • CS9309:擴展成員語法在巢狀位置中不允許使用擴展成員語法。
  • CS9316不允許延伸成員作為 'nameof' 的引數。
  • CS9317一元運算子的參數必須是擴充類型。
  • CS9318++ 或 -- 運算子的參數類型必須是擴充類型。
  • CS9319二進位運算子的其中一個參數必須是擴充類型。
  • CS9320多載移位運算子的第一個運算元必須具有與擴充類型相同的類型。
  • CS9321擴充靜態類別的擴充區塊不能包含使用者定義的運算子。
  • CS9322除非包含的擴充區塊接收器參數是 'ref' 參數,否則無法宣告結構型別的實例運算子。
  • CS9323無法針對未知為結構且未知為類別的類型宣告實例延伸運算子。
  • CS9326'name':延伸模組成員名稱不能與其延伸類型相同。
  • CS9329此擴充區塊與另一個擴充區塊衝突。它們會導致中繼資料中以內容為基礎的類型名稱發生衝突。
  • CS9339下列成員之間的延伸解析不明確。

擴充功能宣告的常見錯誤

  • CS1102參數修飾詞 'out' 不能與 'this' 搭配使用。
  • CS1103擴充方法的第一個參數不能是指針類型。
  • CS1106擴充方法必須在非泛型靜態類別中定義。
  • CS1109擴充方法必須在最上層靜態類別上定義,'name' 是巢狀類別。
  • CS1113在實值型別上定義的擴充方法無法用來建立委派器。
  • CS1743無法指定 'this' 參數的預設值。
  • CS9283延伸模組必須在最上層、非泛型、靜態類別中宣告。
  • CS9284延伸模組的接收者參數不能有預設值。
  • CS9285擴充容器只能有一個接收者參數。

當您違反套用至所有延伸模組成員宣告的規則時,編譯器會發出這些錯誤,而不論所選擇的語法為何。 如需詳細資訊,請參閱 擴充方法

若要正確宣告延伸成員,請遵循下列要求:

  • 將包含類型宣告為非泛型 static 類別或結構 (CS1106CS9283) 。
  • 在最上層宣告所含類型,而不是巢狀在另一個類型內(CS1109CS9283)。
  • 請勿將值類型的擴充方法轉換成委派 (CS1113)。 請改為建立一般方法。
  • 請勿在接收器參數 (out) 上使用參數修飾詞。
  • 請勿提供接收者參數的預設值 (CS1743CS9284) 。
  • 請勿擴充指標類型 (CS1103)。 您套用 this 修飾元的參數不能是指標類型。
  • 每個延伸模組容器只宣告一個接收器參數 (CS9285) 。
  • CS9281延伸模組宣告可能沒有名稱。
  • CS9282延伸模組宣告只能包含方法或屬性。
  • CS9287接收者參數不能與擴充容器類型參數同名。
  • CS9288參數、局部變數或區域函式不能與擴充容器類型參數同名。
  • CS9289成員類型參數的名稱與擴充容器類型參數相同。
  • CS9290參數、局部變數或局部函數不能與擴充參數同名。
  • CS9291value:自動產生的參數名稱與擴充參數名稱衝突。
  • CS9292類型參數的名稱與擴充參數相同。
  • CS9293無法在此內容中使用擴充參數。
  • CS9294'value:自動產生的參數名稱與擴充類型參數名稱衝突。
  • CS9295擴充類型必須參考延伸模組所宣告的所有類型參數,但不會參考類型參數。
  • CS9300延伸模組區塊的 'ref' 接收者參數必須是實值型別或受限於結構的泛型型別。
  • CS9301延伸的 'in' 或 'ref readonly' 接收者參數必須是具體 (非泛型) 實值型別。
  • CS9302延伸模組區塊中宣告的新受保護成員。
  • CS9303無法使用未命名的接收者參數宣告擴充區塊中的實例成員。
  • CS9304無法在擴充區塊中宣告僅限初始化存取子。
  • CS9305無法在擴充區塊的未命名接收者參數上使用修飾詞。
  • CS9306類型和別名不能命名為「延伸模組」。
  • CS9309:不允許在延伸模組成員語法的巢狀結構中使用延伸模組成員語法。
  • CS9316不允許延伸成員作為 'nameof' 的引數。
  • CS9317一元運算子的參數必須是擴充類型。
  • CS9318++ 或 -- 運算子的參數類型必須是擴充類型。
  • CS9319二進位運算子的其中一個參數必須是擴充類型。
  • CS9320多載移位運算子的第一個運算元必須具有與擴充類型相同的類型。
  • CS9321擴充靜態類別的擴充區塊不能包含使用者定義的運算子。
  • CS9322除非包含延伸模組接收器參數是 'ref' 參數,否則無法宣告結構的實例運算子。
  • CS9323無法針對未知為結構且未知為類別的類型宣告實例延伸運算子。
  • CS9326'name':延伸模組成員名稱不能與其延伸類型相同。
  • CS9329此擴充區塊與另一個擴充區塊衝突。它們會導致中繼資料中以內容為基礎的類型名稱發生衝突。
  • CS9339下列成員之間的擴展解析不明確。

這些錯誤是擴展區塊特有的,C# 14 的功能。 擴充程式碼區塊是使用靜態類別中的上下文關鍵字 extension 宣告的。 如需詳細資訊,請參閱 擴充方法

若要正確宣告擴充區塊,請遵循下列需求:

  • 請勿在擴充功能宣告中包含名稱符號 (CS9281)。 延伸模組只會宣告接收者。
  • 請勿提供接收器參數的預設值 (CS9284,請參閱 常見錯誤) 。
  • 請勿針對 extension 類型或別名使用關鍵字 (CS9306)。 它是僅用於擴充區塊的語境關鍵字。

若要正確宣告延伸區塊中的延伸成員,除了 一般規則之外,還請遵循下列需求:

  • 只包含方法或屬性作為延伸模組成員 (CS9282) 。 不支援其他成員類型。
  • 提供接收端的參數名稱,以包含實例延伸模組成員 (CS9303) 。
  • 請確定接收者參數名稱在延伸模組區塊內是唯一的,且不會與類型參數衝突 (CS9287CS9288CS9289CS9290CS9291CS9292CS9294) 。
  • 參考擴充類型中延伸模組上宣告的所有類型參數 (CS9295) 。 可以在個別成員上新增其他類型參數。
  • 請勿將延伸模組區塊巢狀化在其他延伸模組區塊內 (CS9309) 。
  • 請僅在接收器參數上使用修飾詞,並將其與值類型或限制為結構的泛型類型搭配使用refCS9300)。
  • inref readonly 修飾詞僅應用於具體(非泛型)值類型的接收器參數(CS9301)。
  • 請勿在未命名的接收器參數上使用修飾元 (CS9305) 。
  • 請勿在延伸區塊中宣告 protected 成員 (CS9302)。 延伸套件的成員必須在套件的作用範圍內可供存取。
  • 請勿在擴充區塊中宣告 init-only 存取子 (CS9304)。 請改用一般屬性 setter。
  • 請勿使用延伸模組成員作為運算子的 nameof 引數 (CS9316) 。
  • 選擇與擴充類型名稱不同的成員名稱 (CS9326)。
  • 請確定延伸模組區塊在中繼資料中具有唯一的內容型類型名稱 (CS9329) 。 合併或區分擴充區塊以避免衝突。
  • 藉由提供更具體的類型資訊或使用限定名稱來解決模稜兩可的延伸成員呼叫 (CS9339) 。

擴充區塊運算子需求

擴充區塊支援具有特定需求的使用者定義運算子:

  • 一元運算子必須具有擴充類型作為其參數 (CS9317) 。
  • 遞增 (++) 和遞減 (--) 運算子必須具有擴充類型作為其參數 (CS9318)。
  • 二進位運算子必須至少有一個參數,即擴充類型 (CS9319) 。
  • 移位運算子必須將延伸類型作為其第一個運算元 (CS9320)。
  • 請勿在擴充靜態類別的擴充區塊中宣告使用者定義運算子 (CS9321)。
  • 使用實例運算子擴充結構時,請在接收器參數上使用 ref 修飾元 (CS9322) 。
  • 請勿宣告未限制為結構或類別的類型的實例運算子 (CS9323)。
  • CS1100方法具有不在第一個參數上的參數修飾詞 'this'
  • CS1101參數修飾詞 'ref' 不能與 'this' 搭配使用。
  • CS1105擴充方法必須是靜態的。
  • CS1110無法定義新的擴充功能,因為找不到編譯程式所需的類型 ExtensionAttribute 。您是否遺漏 System.Core.dll的參考?
  • CS1112請勿使用 'ExtensionAttribute'。請改用 『this關鍵詞。

這些錯誤是特有於延伸方法的,您可以透過在第一個參數加入 this 修飾詞來宣告接收者。 如需詳細資訊,請參閱 擴充方法

若要正確宣告 this 參數延伸方法,除了 一般規則之外,還請遵循下列需求:

  • 將修飾詞新增至 static 方法 (CS1105)。
  • 僅將參數修飾元套用 this 至第一個參數 (CS1100)。
  • 不要將 ref 修飾詞與 this 修飾詞結合(CS1101)。 若要使用 ref,請轉換為延伸區塊。
  • 在 .NET Framework 應用程式中新增對 System.Core.dll 的參考(CS1110)。
  • 在第一個參數上使用 this 修飾詞,而不是直接套用 ExtensionAttribute 屬性 (CS1112)。