共用方式為


與財產申報相關的錯誤與警告

您可能會遇到以下與財產申報相關的錯誤:

  • CS0200屬性或索引器「屬性」無法指派給 —— 它是唯讀的
  • CS0545:「function」:無法覆寫,因為「property」沒有可覆寫的 get 存取子。
  • CS0571:「 函式」:無法直接呼叫運算子或存取子
  • CS0840:「 屬性名稱」必須宣告一個實體,因為它沒有標記為抽象或外部。自動實作的屬性必須同時定義 get 與 set accessors。
  • CS1014預期取得或設定存取器
  • CS1043{ 或 ;預期
  • CS8050只有自動實作的屬性,或使用「field」關鍵字的屬性,才能有初始化工具
  • CS8051自動實作屬性必須有 get accessors
  • CS8053介面中的實例屬性不能有初始化器
  • CS8145自動實作屬性無法透過引用回傳
  • CS8147透過參考回傳的屬性不能有設定的存取者
  • CS8341唯讀結構體中的自動實例屬性必須為唯讀
  • CS8657靜態成員無法設為「唯讀」
  • CS8658自動實作的「set」存取器無法標記為「唯讀」
  • CS8659自動實作屬性無法標記為「唯讀的」,因為它有一個「set」存取器
  • CS8660無法在屬性及其存取器上指定「唯讀」修飾符
  • CS8661無法在屬性的兩個存取者上指定「唯讀」修飾符
  • CS8664:「唯讀」只能在屬性同時具有 get 和 set 存取子時使用。
  • CS9029類型與別名不能被命名為「必需」。
  • CS9030必須加入會員,因為它會優先於必須會員。
  • CS9031必修成員無法被衍生成員隱藏。
  • CS9032必要的成員不能比包含類型的可見性低,或其 setter 的可見性低於包含類型。
  • CS9033請勿使用 'System.Runtime.CompilerServices.RequiredMemberAttribute'.在必填欄位和屬性上使用「required」關鍵字。
  • CS9034必須是可設置的成員。
  • CS9035必須在物件初始化器或屬性建構子中設定所需成員。
  • CS9036必須的成員「memberName」必須被賦予一個值,不能使用巢狀成員或集合初始化器。
  • CS9037所需成員名單格式錯誤,無法解釋。
  • CS9038基底型別的必要成員清單格式錯誤,無法解釋。要使用此建構子,請套用 'SetsRequiredMembers' 屬性
  • CS9039這個建構子必須加上 'SetsRequiredMembers',因為它是鏈到一個具有該屬性的建構子。
  • CS9040類型無法滿足new()泛型類型或方法中參數的「''限制,因為它有所需的成員。
  • CS9042除非所包含的類型已過時或所有建構子都已過時,否則不應該將必要成員標註為「ObsoleteAttribute'」。
  • CS9045必要的成員不得出現在腳本或程式的頂層。
  • CS9258在此語言版本中,'field' 關鍵詞會系結至屬性的合成支援字段。若要避免產生合成支援欄位,並參考現有的成員,請改用'this.field' 或 '@field' 。
  • CS9263部分屬性在定義和實作上都不能有初始化表達式。

可以為以字段支援的屬性產生以下警告:

  • CS9264非空屬性在退出建構子時必須包含非空值。可以考慮加入「required」修飾符,或將該屬性宣告為可空,或加入「[field: MaybeNull, AllowNull]''屬性。
  • CS9266屬性的一個存取子應該使用 『field',因為另一個存取子正在使用它。
  • CS9273在此語言版本中,'field' 是屬性存取子內的關鍵詞。請重新命名變數,或使用標識碼 『@field

以下各節將說明這些錯誤和警告的原因及其修正方法。

屬性存取器語法

  • CS0545「function」:無法覆寫,因為「property」沒有可覆寫的 get 存取子。
  • CS0571:「函式」:無法明確呼叫運算子或存取子
  • CS1043{ 或 ;預期

要修正屬性存取器語法錯誤,請根據特定診斷套用以下其中一項變更:

僅覆蓋存在於基類屬性宣告(CS0545)中的存取器。 你無法覆寫基底類別中不存在或無法存取的屬性存取器,因為編譯後的 IL 中沒有虛擬方法可以覆寫。 如果基底類別屬性只有一個 get 存取子,請從您的覆寫中移除該 set 存取子,或在基底類別中加入缺少的存取子,並將其標記為 virtual。 或者,使用 new 關鍵字代替 override 隱藏基底類別屬性,並使用全新的屬性定義,並擁有不同的存取者。

使用屬性語法存取屬性,而非直接呼叫存取者方法(CS0571)。 屬性存取器會編譯成名稱如get_PropertyNameset_PropertyName的特殊方法,但你應該透過屬性語法(obj.Propertyobj.Property = value)來呼叫這些方法。 此方法能維持正確的語意,並允許編譯器執行必要的檢查。 同樣的原理也適用於運算子,運算子編譯成類似 op_Increment 的方法,但應使用運算子語法()++obj而非方法呼叫。

使用適當的屬性存取器語法,搭配大括號或表達式主體(CS1043)。 屬性存取器必須遵循 C# 語法規則:存取器主體必須以大括 { }包覆,表達式主體存取器必須使用=>語法,自動實作的屬性必須在存取器清單後以分號結束。 編譯器期望有完整的存取器實作,或是用來表示自動實作的附屬器的分號。

欲了解更多資訊,請參閱 「屬性繼承屬性使用」。

自動實作的程式屬性

  • CS0840:「 屬性名稱」必須宣告一個實體,因為它沒有標記為抽象或外部。自動實作的屬性必須同時定義 get 與 set accessors。
  • CS1014預期取得或設定存取器

要修正自動實作屬性錯誤,請根據特定診斷套用以下其中一項變更:

請將 getset 兩者加入屬性宣告(CS0840)。 自動實作屬性要求編譯器產生一個後備欄位,且只有當兩個存取者同時存在時,編譯器才能完成此操作,以確保儲存空間能同時被讀取與寫入。 如果你需要一個只讀的自動實作屬性,可以加入 set 一個存取器,並讓 private 它限制寫入存取,同時允許編譯器產生後備欄位。 或者,如果屬性被宣告為 abstractextern,則完全移除這些存取器主體,因為這些修飾符表示實作已在其他地方提供。 對於 partial 屬性,你可以將宣告和實作拆分成部分型別宣告。

確保屬性宣告僅包含有效的存取者關鍵字 getsetCS1014)。 屬性語法僅允許存取者宣告,不允許在屬性體內任意陳述或成員宣告。 如果你需要額外的邏輯,可以用包含你的程式碼的明確存取子函數來實作這個屬性。 如果你想宣告欄位或方法,請將這些宣告移到允許成員宣告的類別或結構體。

欲了解更多資訊,請參閱 屬性自動實作屬性

字段支持的屬性

  • CS9258在此語言版本中,'field' 關鍵詞會系結至屬性的合成支援字段。若要避免產生合成支援欄位,並參考現有的成員,請改用'this.field' 或 '@field' 。
  • CS9263部分屬性在定義和實作上都不能有初始化表達式。
  • CS9264非空屬性在退出建構子時必須包含非空值。可以考慮加入「required」修飾符,或將該屬性宣告為可空,或加入「[field: MaybeNull, AllowNull]''屬性。
  • CS9266屬性的一個存取子應該使用 『field',因為另一個存取子正在使用它。
  • CS9273在此語言版本中,'field' 是屬性存取子內的關鍵詞。請重新命名變數,或使用標識碼 『@field

要修正現場支持的屬性錯誤,請根據特定診斷方法進行以下其中一項變更:

將任何已命名 field 的變數重新命名為不同的識別碼,或使用 @field 跳脫語法來指代你的變數(CS9258CS9273)。 此修正是必要的,因為 field 是 在 C# 13 及以後版本的屬性存取器中,作為上下文關鍵字,指的是編譯器合成的後盾欄位。 如果你想存取已存在成員名稱 field ,而非合成的背景欄位,請用 this.field 來消除歧義。

將初始化器從部分屬性定義或實作中移除,只保留一個(CS9263)。 此修正是因為允許同時在兩個位置設置初始化器會造成使用哪個值的模糊性,並可能導致背對欄位初始化兩次且值可能不同。

在屬性宣告中加入 [field: MaybeNull, AllowNull] 屬性,表示該支持欄位應視為可空(CS9264)。 此修正使屬性類型與編譯器合成的支援欄位間的可空性預期保持一致,解決了屬性宣告為不可空,但使用 field 關鍵字暗示可能為空的不一致問題。 或者,將屬性類型改為可空(nullable)、加入 required 修飾符以確保初始化,或在建構子中初始化該屬性。

在兩個存取器中,要麼一致使用field關鍵字,要麼在兩個存取器中使用明確的後盾欄位(CS9266)。 此修正可避免一個存取者修改編譯器合成的後備欄位,而另一個存取者修改不同儲存位置,導致屬性行為不一致的錯誤。

欲了解更多資訊,請參閱 欄位關鍵字部分屬性

可讀性質

  • CS0200屬性或索引器『property』不能賦值 —— 它是唯讀的
  • CS8341可讀結構中的自動實例屬性必須為可讀
  • CS8657靜態成員無法標記為「唯讀」
  • CS8658自動實作的「set」存取子無法標記為「唯讀」
  • CS8659自動實作的屬性無法標記為唯讀,因為有 set 存取器
  • CS8660無法在屬性及其存取器上指定「只讀」修飾符
  • CS8661無法在屬性的兩個存取者上指定「唯讀」修飾符
  • CS8664如果屬性同時具有 get 和 set,唯讀只能用於存取器。

要修正只讀屬性錯誤,請根據特定診斷套用以下其中一項變更:

在屬性中加入 setinit accessor 來使其可寫(CS0200)。 此修正是必要的,因為沒有集合存取器的屬性是唯讀的,且只能在宣告型別的建構子或欄位初始化器中指派。 如果你需要在物件初始化時設定該屬性,但之後又保持不可變,請使用 init 存取器代替 set 附加元件。 若該屬性應保持唯讀,請將賦值移至允許初始化的建構子中,或重新考慮是否有必要該賦值。

readonly struct中宣告時,將自動實作的實例屬性標記為readonlyCS8341)。 此修正強制執行包含結構的不可變性契約,確保所有實例成員遵守保證 readonly 。 如果屬性需要可變,要麼移除 readonly 結構體宣告中的修飾符,要麼用明確的後盾欄位和不修改實例狀態的存取器實體實作該屬性。

移除 readonly 靜態屬性或存取者宣告中的修飾符(CS8657)。 此修正是必要的,因為修 readonly 飾符僅適用於結構體的實例成員,表示他們不修改實例狀態,而靜態成員則沒有實例狀態可保護。 如果你需要只讀的靜態屬性,只需省略 set 存取器,而不是使用 readonly 修飾符號。

移除自動實作的存取器readonly中的修飾符set,或僅套用於該get存取器(CS8658)。 此修正是必要的,因為 set 存取器本質上會修改狀態,這與修飾符的目的 readonly 相矛盾,該修正器保證不會修改實例狀態。 如果你需要一個可以在初始化時設定但之後只能讀取的屬性,請使用 init 存取器代替 set 附加元件。

當屬性有readonly存取者(set)時,移除屬性聲明中的修飾符。 此修正是必要的,因為帶有set存取器的屬性可能會修改實例狀態,這樣會違反readonly的保證。 如果僅在初始化時需要設定,請用 init 存取器取代 set 存取器,或完全移除 set 存取器,使該屬性成為真正的唯讀。

修飾子可以放在屬性宣告或個別存取器上,但不能在兩者上同時放置(CS8660CS8661)。 此修正避免了重複的修飾符宣告,避免混淆哪個修飾符優先。 如果你想將特定的存取子標記為 readonly,請從屬性宣告中移除修飾符,並僅將其放在存取子上。 或者,若需標記所有存取器,則應標記readonly屬性本身,而非個別存取器。

確保在標記個別存取器為 readonlyCS8664)時,getset 存取器都存在。 此修正是必要的,因為 readonly 個別存取器的修飾符區分了修改狀態的存取器與不修改狀態的存取器,只有當兩種存取器類型都存在時才有意義。 如果該屬性只有一個 get 附屬物件,請將整個屬性標記為 , readonly 而非單一附屬物件。

欲了解更多資訊,請參閱 唯讀實例成員init 關鍵字屬性

屬性初始化

  • CS8050只有自動實作的屬性,或使用「field」關鍵字的屬性,才能有初始化工具
  • CS8051自動實作屬性必須有 get accessors
  • CS8053介面中的實例屬性不能有初始化器

要修正屬性初始化器錯誤,請根據特定診斷套用以下其中一項變更:

將屬性轉換為自動實作語法,方法是移除存取器主體,讓編譯器產生後盾欄位(CS8050)。 此修正是必要的,因為只有由編譯器管理的儲存特性才能有初始化器,確保初始化在任何存取器邏輯執行前完成。 或者,修改存取器實作,使其使用 field 關鍵字來存取編譯器合成的後台欄位。 此方法允許初始化器同時維持自訂的存取器邏輯。 如果兩種方法都不適用,就移除初始化器,改用建構子指派該值,這樣你就能完全控制初始化序列。

在自動實作的屬性中新增get存取器,以允許讀取已初始化的值(CS8051)。 此修正是必要的,因為初始化器設定的值必須可被檢索,而唯寫屬性違反了屬性初始化的基本期望。 如果你真的需要一個只有寫入的屬性,請明確實作存取子,並使用支援欄位來實作,然後在建構函式中直接指定該欄位,而不是使用屬性初始化器。

移除介面屬性宣告中的初始化器(CS8053)。 此修正是必要的,因為介面定義的是實作型別的契約,而非提供具初值的具體實作。 如果你需要提供預設值,請在實作介面的類別中實作該屬性,或使用預設介面方法(C# 8.0 及更新版本中可用)來提供預設實作。

欲了解更多資訊,請參閱 屬性自動實作屬性欄位關鍵字

必要成員

  • CS9029類型與別名不能被命名為「必需」。
  • CS9030必須加入會員,因為它會優先於必須會員。
  • CS9031必修成員無法被衍生成員隱藏。
  • CS9032必要成員的可見性不得低於其所屬類別,也不能有可見性低於類別的設定者。
  • CS9033請勿使用 'System.Runtime.CompilerServices.RequiredMemberAttribute'.在必填欄位和屬性上使用「required」關鍵字。
  • CS9034必要的成員必須可設置。
  • CS9035必須在物件初始化器或屬性建構子中設定所需成員。
  • CS9036必須的成員「memberName」必須被賦予一個值,不能使用巢狀成員或集合初始化器。
  • CS9037所需成員名單格式錯誤,無法解釋。
  • CS9038基底型別的必要成員清單格式錯誤,無法解釋。要使用此建構子,請套用 'SetsRequiredMembers' 屬性
  • CS9039這個建構子必須加上 'SetsRequiredMembers',因為它是鏈到一個具有該屬性的建構子。
  • CS9040類型無法滿足new()泛型類型或方法中參數的「''限制,因為它有所需的成員。
  • CS9042除非所包含的類型已過時或所有建構子都已過時,否則不應該將必要成員標註為「ObsoleteAttribute'」。
  • CS9045必須成員不得出現在劇本或投稿的頂層。

要修正必要的成員錯誤,請根據特定診斷套用以下其中一項變更:

避免將它 required 用作類型或別名(CS9029)。 此修正是必要的,因為 required 是 在 C# 11 及之後版本的上下文關鍵字,使用它作為型別名稱會造成關鍵字出現的程式碼歧義。

確保派生成員在覆寫必要成員時仍維持修 required 飾符(CS9030)。 此修正強制執行基底類別所建立的合約,確保所有衍生型別維持相同的初始化要求。 避免在衍生類別(CS9031)中將必需成員隱藏為非必需成員,因為此行為會違反消費者對基底型態的初始化合約。

必須成員的可見性至少要與包含它們的類型相同,並確保屬性設定器的可見性也足夠(CS9032)。 此修正可避免某個型別雖然可供公開存取,但無法於所有該型別的建構上下文中初始化其所需成員的情況發生。

請使用 required 關鍵字,不要手動應用 RequiredMemberAttributeCS9033)。 此修正確保編譯器產生正確的元資料並強制執行所有必要的成員規則,避免手動屬性應用程式無法正確執行。

確保所需的成員擁有設定存取子的能力,或能夠以其他方式進行設定(CS9034)。 此修正是必要的,因為必須在物件建立時初始化所需成員,而這需要寫入權限。 建立實例時,請直接在物件初始化器(CS9035CS9036)中初始化所需成員。 你必須為每個必需成員指派一個值,而不是使用巢狀成員初始化器或集合初始化器,因為必須先設定所需成員才能存取其屬性。

將屬性 SetsRequiredMembers 套用於能初始化其實體中所有必要成員的建構器(CS9038CS9039)。 此修正通知編譯器建構子已完成所需的成員合約,允許在不使用物件初始化器的情況下建立物件。 如果一個建構子鏈接到另一個具有 SetsRequiredMembers的建構子,那麼它也必須具有該屬性。

避免在必須符合 new() 限制條件(CS9040)的型別中使用必要成員,因為無參數建構子無法保證沒有物件初始化器即可完成必要的成員初始化。 除非包含的類型或所有構造器都已過時(CS9042),否則不要將必需成員標記為過時,以避免需要成員但不被鼓勵使用的情況。 頂層語句或腳本上下文(CS9045)不允許使用必要成員,因為這些上下文不支援設定必要成員所需的物件初始化語法。

欲了解更多資訊,請參閱 必要修飾符 參考文章及 物件與集合初始化器 指南。

返回引用屬性

  • CS8145自動實作屬性無法透過引用回傳
  • CS8147透過參考回傳的屬性不能有設定的存取者

要修正參考回傳的屬性錯誤,請根據特定診斷套用以下其中一項變更:

明確實作該屬性並使用後備欄位,然後在取值子的回傳運算式中使用ref關鍵字(get)。 此修正是必要的,因為自動實作屬性會產生一個私有的後台欄位,編譯器在內部管理。 回傳私有欄位的引用會暴露呼叫者不應該直接存取的內部儲存空間。 要建立一個引用回傳屬性,請宣告一個明確欄位並以 => ref backingField 語法回傳。 或者,如果你不需要回傳一個參考來允許對儲存進行直接修改,請從屬性宣告中移除 ref 修飾符。

移除回傳 ref 的屬性中的 set 存取子(CS8147)。 此修正是必要的,因為 ref-returning 屬性已透過回傳參考本身提供讀寫存取。 呼叫者可直接透過參考修改值,無需另行設定方法。 加入 set 存取器會產生兩種不同的修改機制,這會造成冗餘,且可能導致使用哪種修改路徑的混淆。

欲了解更多資訊,請參閱 ref returns、ref localsProperties