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

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

  • CS0200: 屬性或索引器「屬性」無法指派給 —— 它是唯讀的
  • CS0273: 『accessor』accessr 的可達性修飾符必須比屬性或索引器 'property' 更嚴格
  • CS0274: 無法為屬性或索引器「property」的兩個存取者指定可及性修飾符
  • CS0275:「存取子」:在介面中的存取子上不可使用存取修飾符
  • CS0276:「 property」:只有當屬性或索引器同時擁有 get 與 set accessr 時,才能對存取器使用可達性修飾符
  • CS0442:「 property」:抽象屬性不能有私有存取者
  • CS0544:「屬性」不能被覆寫,因為「成員」不是屬性
  • CS0545:「function」:無法覆寫,因為「property」沒有可覆寫的 get 存取子。
  • CS0546:「 accessor」:無法覆寫,因為「property」沒有可覆寫的集合存取器
  • CS0547:「 property」:屬性或索引器不能有空型
  • CS0548:「property」:屬性或索引子必須至少有一個存取子。
  • CS0571:「 函式」:無法直接呼叫運算子或存取子
  • CS0610: 欄位或屬性不能是類型 'type'
  • CS0840:「 屬性名稱」必須宣告一個實體,因為它沒有標記為抽象或外部。自動實作的屬性必須同時定義 get 與 set accessors。
  • CS1014: 預期取得或設定存取器
  • CS1043: { 或 ;預期
  • CS1715:「'類型':類型必須符合被覆寫成員 'member' 的類型」
  • CS8050: 只有自動實作的屬性,或使用「field」關鍵字的屬性,才能有初始化器。
  • CS8051: 自動實作屬性必須有 get accessors。
  • CS8053: 介面中的實例屬性不能有初始化器。
  • CS8080: 自動實作屬性必須覆蓋被覆寫屬性的所有存取者。
  • CS8145: 自動實作屬性無法透過引用回傳
  • CS8147: 透過參考回傳的屬性不能有設定的存取者
  • CS8341: 在可讀結構中自動實作的實例屬性必須是可讀的。
  • CS8657: 靜態成員「成員」無法標記為「唯讀」。
  • CS8658: 自動實作的「設定」存取子 '設置器' 無法標記為「唯獨」。
  • CS8659: 自動實作屬性「property」無法標示為「唯讀」,因為它有「set 存取器」。
  • CS8660: 無法在屬性或索引子「property」及其存取子上指定「唯讀」修飾符。移除其中一個。
  • CS8661:無法在屬性或索引器的兩個存取子上指定「唯讀」修飾符。請將「唯讀」修飾符直接加在屬性本身。
  • CS8664:「'property':只有當屬性或索引器同時擁有 get 與 set accessor 時,才能在 accessor 上使用 'readonly'
  • CS8852: 僅初始化屬性或索引器「屬性」只能在物件初始化器中指派,或在實例建構子或「init」存取器中指派於「this」或「base」。
  • CS8853:「 成員」必須僅透過被覆寫的成員「成員」的初始化匹配
  • CS8855: 存取器「accessor」和「accessor」應該都為僅初始化,或兩者都不是
  • CS8856:「 init」存取器在靜態成員上無效
  • CS8903: 「init」存取器不能被標記為「唯讀」。請將「property」標記為只讀。
  • 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: 非可空屬性「property」在退出建構函式時必須包含非空值。考慮加入「required」修改器,或宣告該屬性為可空,或在「field」存取器中安全處理get為空的情況。
  • CS9266: 屬性「property」的「accessor」應該使用'field',因為另一個「accessor」正在使用。
  • CS9273: 在此語言版本中,'field' 是屬性存取子內的關鍵詞。請重新命名變數,或使用標識碼 『@field。

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

存取器存取性

  • CS0273: 『accessor』accessr 的可達性修飾符必須比屬性或索引器 'property' 更嚴格
  • CS0274: 無法為屬性或索引器「property」的兩個存取者指定可及性修飾符
  • CS0275:「存取子」:介面中不得使用存取修飾詞
  • CS0276:「 property」:只有當屬性或索引器同時擁有 get 與 set accessr 時,才能對存取器使用可達性修飾符
  • CS0442:「 property」:抽象屬性不能有私有存取者

這些錯誤會強制執行屬性與索引器存取者的存取修飾符規則。 完整規則請參閱 C# 規範中的「 限制存取器可及 性與 存取器 」。 要修正這些錯誤,請根據特定診斷進行以下其中一項變更:

  • 使用比該屬性宣告的存取性更嚴格的存取修飾符(CS0273)。 例如,一個 internal 屬性可以有一個 private 設定子,但不能有 public。 附件的無障礙必須是該物業無障礙的適當子集。
  • 只對兩個存取器中的一個(CS0274)施加存取修飾符。 屬性宣告本身會為兩個存取者建立預設的可存取性,且只能有一個存取器與該預設不同。 將存取修飾符放置於需要受限制存取的存取子。
  • 在介面屬性宣告(CS0275)中移除存取修飾符。 介面成員定義公開合約,且不允許對個別存取者設置存取修改符。 如果你需要限制存取權限,請在實作類別中套用限制。
  • 在對get 和set 其中任一存取子套用存取修飾符 (CS0276) 之前,先在屬性中加入這兩個存取子。 存取修飾符用以區分兩個存取器的可見性,這需要兩個存取器同時存在。 如果該屬性只有一個存取子,則移除其存取修飾詞。
  • 將抽象屬性存取器的存取修飾符從 private 更改為較寬鬆的修飾符(CS0442)。 抽象成員必須對衍生類別開放,讓這些類別能提供實作。 使用 protected、 internal,或 protected internal 取代 private。

欲了解更多資訊,請參閱限制存取器可及性與屬性。

財產宣告語法

  • CS0547:「 property」:屬性或索引器不能有空型
  • CS0548:「property」:property或indexer必須至少有一個存取子。
  • CS0571:「函式」:無法明確呼叫運算子或存取子
  • CS0610: 欄位或屬性不能是類型 'type'
  • CS0840:「 屬性名稱」必須宣告一個實體,因為它沒有標記為抽象或外部。自動實作的屬性必須同時定義 get 與 set accessors。
  • CS1014: 預期取得或設定存取器
  • CS1043: { 或 ;預期

這些錯誤強制執行財產與索引者聲明的結構性要求。 完整規則請參閱 C# 規範中的 屬性 與 屬性 部分。 要修正這些錯誤,請根據特定診斷進行以下其中一項變更:

  • 將屬性類型從 void 更改為有效類型(CS0547)。 屬性和索引器代表表達式, void 並不是有效的表達式類型。 選擇該屬性所代表的資料類型。
  • 在屬性宣告(get)中至少新增一個存取器(set、 init、 或 )。 屬性若沒有任何存取器,便無法讀取或寫入其值。 可以加入 get 存取器、set 存取器或 init 存取器,或兩者都有。
  • 使用屬性語法存取屬性,而非直接呼叫存取者方法(CS0571)。 屬性存取器會編譯為名為 get_PropertyName 和 set_PropertyName的方法,但透過屬性語法(obj.Property 和 obj.Property = value)來呼叫這些方法。 同樣的原理也適用於運算子。 使用運算子語法(++obj)而非呼叫方法 op_Increment。
  • 將欄位或屬性類型從受限型態改為允許型態(CS0610)。 某些類型如 TypedReference 和 ArgIterator 不能用作欄位或屬性。 這些類型仍可用作方法參數或區域變數。
  • 對於唯讀屬性,宣告一個僅限自動實作的屬性。 否則,請將 get 和 set 兩者加入自動實作的屬性宣告中,或提供明確的存取器主體(CS0840)。 對於需要自訂邏輯的屬性,請使用 C# 13 中新增的 field 關鍵字,以在存取器主體中存取編譯器合成的後設欄位。 對於 abstract 或 extern 屬性,請移除 accessor body,因為實作已在其他地方提供。 對於 partial 屬性,請將宣告與實作拆分到部分型別宣告。
  • 確保屬性主體僅包含有效的存取器關鍵字——、get、 set或 init (CS1014)。 財產機構不能包含任意聲明或成員聲明。 將欄位和方法從屬性移動到類別或結構中。
  • 使用適當的屬性存取器語法,搭配大括號或表達式主體(CS1043)。 存取器實體必須使用大括號 { },表達式實體存取器必須使用 => 語法,自動實作的屬性則必須在存取者標記後加分號。

欲了解更多資訊,請參閱 屬性、 自動實作屬性及 使用屬性。

屬性覆寫

  • CS0544:'屬性':無法覆寫,因為「成員」不是屬性
  • CS0545:「function」:無法覆寫,因為「property」沒有可覆寫的 get 存取子。
  • CS0546:「 accessor」:無法覆寫,因為「property」沒有可覆寫的集合存取器
  • CS1715:「 類型」:類型必須為「類型」以匹配被覆寫的成員「成員」
  • CS8080: 自動實作屬性必須覆蓋被覆寫屬性的所有存取者。

這些錯誤強制執行導出類別中覆寫屬性的規則。 完整規則請參閱 C# 規範中的繼 承 與 虛擬、封閉、覆寫與抽象存取器 章節。 要修正這些錯誤,請根據特定診斷進行以下其中一項變更:

  • 確保你覆寫的成員是屬性,而非欄位或方法(CS0544)。 override屬性上的關鍵字只能針對基底類別中的屬性virtual、屬性abstractoverride。 若要用屬性隱藏非屬性成員,請使用new關鍵字代替override。
  • 僅覆蓋基底類別屬性宣告中存在的存取器(CS0545, CS0546)。 你無法覆蓋基底類別中不存在或無法存取的屬性存取器,因為沒有虛擬方法可以覆蓋。 如果基底類別屬性只有一個 get accessor,你就無法透過覆寫來新增 set accessor。 要麼將缺少的存取器加入基底類別並標記 virtual,要麼用 new 新的屬性定義隱藏基底類別屬性。
  • 將覆蓋屬性的類型與被覆蓋成員的類型(CS1715)相匹配。 唯讀(get-only)屬性從 C# 9 開始支援協變回傳類型,因此覆寫可以回傳更具衍生性的類型。 然而,具有 set 或 init 存取子的屬性需要完全相符的型別,因為設置器接受宣告型別所接受的值。 如果你需要在帶有 setter 的屬性上使用不同的類型,可以將衍生類別的屬性類型改成與基底類別宣告相符,或移除 setter 並改用協變回傳類型。
  • 當用自動實作屬性(CS8080)覆寫時,請確保包含基礎屬性中的所有存取器。 自動實作屬性會產生儲存與存取器實作,因此必須覆蓋基底類別中所有存取權。 如果基礎屬性同時具有 get 和 set,那麼自動實作的覆寫也必須同時具備這兩者。 若要只覆蓋特定存取者,應以明確的存取器主體和明確的後盾欄位實作該屬性,而非自動實作。 如果基底類別的屬性具有 private 存取子,則無法使用自動實作屬性來覆寫該屬性。 改用明確的存取子主體。

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

字段支持的屬性

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

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

  • 將任何已命名 field 的變數重新命名為不同的識別碼,或使用 @field 跳脫語法來指代你的變數(CS9258、 CS9273)。 此修正是必要的,因為 field 是 在 C# 13 及以後版本的屬性存取器中,作為上下文關鍵字,指的是編譯器合成的後盾欄位。 如果你想存取已存在成員名稱 field ,而非合成的背景欄位,請用 this.field 來消除歧義。
  • 將初始化器從部分屬性定義或實作中移除,只保留一個(CS9263)。 此修正是因為允許同時在兩個位置設置初始化器會造成使用哪個值的模糊性,並可能導致背對欄位初始化兩次且值可能不同。
  • 在屬性宣告中加入 [field: MaybeNull, AllowNull] 屬性,表示該支持欄位應視為可空(CS9264)。 此修正使屬性類型與編譯器合成的支援欄位間的可空性預期保持一致,解決了屬性宣告為不可空,但使用 field 關鍵字暗示可能為空的不一致問題。 或者,將屬性類型改為可空(nullable)、加入 required 修飾符以確保初始化,或在建構子中初始化該屬性。
  • 在兩個存取器中,要麼一致使用field關鍵字,要麼在兩個存取器中使用明確的後盾欄位(CS9266)。 此修正可避免一個存取者修改編譯器合成的後備欄位,而另一個存取者修改不同儲存位置,導致屬性行為不一致的錯誤。

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

可讀性質

  • CS0200: 屬性或索引器『property』不能賦值 —— 它是唯讀的
  • CS8341: 在可讀結構中自動實作的實例屬性必須是可讀的。
  • CS8657: 靜態成員「成員」無法標記為「唯讀」。
  • CS8658:自動實作的「set」訪問子(accessor)無法被標示為「唯讀」。
  • CS8659: 自動實作屬性「property」無法標記為「唯讀」,因為它具有「設定」存取子。
  • CS8660: 無法對屬性或索引器「property」及其存取子指定「唯讀」修飾符。請移除其中一個。
  • CS8661: 無法在屬性或索引器「屬性」的兩個存取者上指定「唯讀」修飾符。相反地,對屬性本身加上「唯讀」修飾符。
  • CS8664:'property':只有當屬性或索引器同時擁有 get 和 set 存取子時,才能在存取子上使用 'readonly'

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

  • 在屬性中加入 set 或 init accessor 來使其可寫(CS0200)。 此修正是必要的,因為沒有集合存取器的屬性是唯讀的,且只能在宣告型別的建構子或欄位初始化器中指派。 如果你需要在物件初始化時設定該屬性,但之後又保持不可變,請使用 init 存取器代替 set 附加元件。 若該屬性應保持唯讀,請將賦值移至允許初始化的建構子中,或重新考慮是否有必要該賦值。
  • 在readonly中宣告時,將自動實作的實例屬性標記為readonly struct(CS8341)。 此修正強制執行包含結構的不可變性契約,確保所有實例成員遵守保證 readonly 。 如果屬性需要可變,要麼移除 readonly 結構體宣告中的修飾符,要麼用明確的後盾欄位和不修改實例狀態的存取器實體實作該屬性。
  • 移除 readonly 靜態屬性或存取者宣告中的修飾符(CS8657)。 此修正是必要的,因為修 readonly 飾符僅適用於結構體的實例成員,表示他們不修改實例狀態,而靜態成員則沒有實例狀態可保護。 如果你需要只讀的靜態屬性,只需省略 set 存取器,而不是使用 readonly 修飾符號。
  • 移除自動實作的存取器readonly中的修飾符set,或僅套用於該get存取器(CS8658)。 此修正是必要的,因為 set 存取器本質上會修改狀態,這與修飾符的目的 readonly 相矛盾,該修正器保證不會修改實例狀態。 如果你需要一個可以在初始化時設定但之後只能讀取的屬性,請使用 init 存取器代替 set 附加元件。
  • 當屬性有readonly存取者(set)時,移除屬性聲明中的修飾符。 此修正是必要的,因為帶有set存取器的屬性可能會修改實例狀態,這樣會違反readonly的保證。 如果僅在初始化時需要設定,請用 set 存取器取代 init 存取器,或完全移除 set 存取器,使該屬性成為真正的唯讀。
  • 修飾子可以放在屬性宣告或個別存取器上,但不能在兩者上同時放置(readonly、CS8661)。 此修正避免了重複的修飾符宣告,避免混淆哪個修飾符優先。 如果你想將特定的存取子標記為 readonly,請從屬性宣告中移除修飾符,並僅將其放在存取子上。 或者,若需標記所有存取器,則應標記readonly屬性本身,而非個別存取器。
  • 確保在標記個別存取器為 get(set)時,readonly 和 存取器都存在。 此修正是必要的,因為 readonly 個別存取器的修飾符區分了修改狀態的存取器與不修改狀態的存取器,只有當兩種存取器類型都存在時才有意義。 如果該屬性只有一個 get 附屬物件,請將整個屬性標記為 , readonly 而非單一附屬物件。

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

初始化唯讀屬性

  • CS8852: 僅初始化屬性或索引器「屬性」只能在物件初始化器中指派,或在實例建構子或「init」存取器中指派於「this」或「base」。
  • CS8853:「 成員」必須僅透過被覆寫的成員「成員」的初始化匹配
  • CS8855: 存取器「accessor」和「accessor」都應該是僅初始化的,或兩者都不是
  • CS8856:「 init」存取器在靜態成員上無效
  • CS8903:「init」存取器不能被標記為「唯讀」。請將「property」標記為「唯讀」。

這些錯誤會強制執行該存取器的規則 init ,從而實現不可變的物件初始化。 完整規則請參見 init 關鍵字。 要修正這些錯誤,請根據特定診斷進行以下其中一項變更:

  • 將僅初始化屬性的指派轉移到物件初始化器、建構子或 init 存取器(CS8852)。 物件建構完成後,無法指派僅初始化的屬性。 在建構子主體中指派值、 init 一個附庸或物件初始化運算式(new MyType { Property = value })。 如果你需要在建構後指定屬性,請將init 存取子更改為set 存取子。
  • 覆寫屬性時,請對應 init 或 set 存取器類型(CS8853)。 若基底類別屬性使用了 init 存取子,則覆寫的屬性也必須使用 init。 同樣地,若基底使用 set,覆寫必須使用 set。 這種一致性確保基型所建立的不變性契約在衍生型態中得以保留。
  • 在明確介面實作(init)中,對兩個存取器使用相同的存取器類型(set或)。 當一個型別明確實作兩個宣告相同屬性的介面時,兩個存取器實作必須一致:必須全部使用init或全部使用set。
  • 將該存取器從靜態屬性宣告中移除 init ,或將其改為 set 存取器(CS8856)。 init該存取器是為與物件建構相關的初始化模式設計的,靜態成員不參與物件初始化。 使用 set 存取器來處理可變的靜態屬性,或完全移除設定器以設定唯讀的靜態屬性。
  • 從readonly存取器(init)中移除修飾符。 結構體成員的 readonly 修飾鍵保證該成員不會改變結構體實例。 由於 init 存取器會指派實例狀態,它本質上會變異結構體,無法標記 readonly。 要將 get 修飾符僅套用於 readonly 的 readonly 存取器 get 。

欲了解更多資訊,請參閱 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 關鍵字,不要手動應用 RequiredMemberAttribute (CS9033)。 此修正確保編譯器產生正確的元資料並強制執行所有必要的成員規則,避免手動屬性應用程式無法正確執行。
  • 確保所需的成員擁有設定存取子的能力,或能夠以其他方式進行設定(CS9034)。 此修正是必要的,因為必須在物件建立時初始化所需成員,而這需要寫入權限。 建立實例時,請直接在物件初始化器(CS9035、 CS9036)中初始化所需成員。 你必須為每個必需成員指派一個值,而不是使用巢狀成員初始化器或集合初始化器,因為必須先設定所需成員才能存取其屬性。
  • 將屬性 SetsRequiredMembers 套用於能初始化其實體中所有必要成員的建構器(CS9038、 CS9039)。 此修正通知編譯器建構子已完成所需的成員合約,允許在不使用物件初始化器的情況下建立物件。 如果一個建構子鏈接到另一個具有 SetsRequiredMembers的建構子,那麼它也必須具有該屬性。
  • 避免在必須符合 new() 限制條件(CS9040)的型別中使用必要成員,因為無參數建構子無法保證沒有物件初始化器即可完成必要的成員初始化。 除非包含的類型或所有構造器都已過時(CS9042),否則不要將必需成員標記為過時,以避免需要成員但不被鼓勵使用的情況。 頂層語句或腳本上下文(CS9045)不允許使用必要成員,因為這些上下文不支援設定必要成員所需的物件初始化語法。

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

返回引用屬性

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

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

  • 明確實作該屬性並使用後備欄位,然後在取值子的回傳運算式中使用ref關鍵字(get)。 此修正是必要的,因為自動實作屬性會產生一個私有的後台欄位,編譯器在內部管理。 回傳私有欄位的引用會暴露呼叫者不應該直接存取的內部儲存空間。 要建立一個引用回傳屬性,請宣告一個明確欄位並以 => ref backingField 語法回傳。 或者,如果你不需要回傳一個參考來允許對儲存進行直接修改,請從屬性宣告中移除 ref 修飾符。
  • 移除回傳 ref 的屬性中的 set 存取子(CS8147)。 此修正是必要的,因為 ref-returning 屬性已透過回傳參考本身提供讀寫存取。 呼叫者可直接透過參考修改值,無需另行設定方法。 加入 set 存取器會產生兩種不同的修改機制,這會造成冗餘,且可能導致使用哪種修改路徑的混淆。

欲了解更多資訊,請參閱 ref returns、ref locals 及 Properties。