本文涵蓋下列編譯器錯誤和警告:
- CS0171:欄位 'name' 必須在控制權傳回給呼叫端之前完全指派。請考慮更新為語言版本 'version',以自動將該欄位設為預設值。
- CS0188:在所有欄位都已指派值之前,無法使用 'this' 物件。請考慮更新至語言版本 'version',以自動將尚未指派的欄位設為預設值。
- CS0843: 自動實作屬性「name」必須完全指派,才能將控制權還給呼叫者。考慮更新到語言版本的 'version',以自動預設該屬性。
- CS1617: /langversion 的選項無效。使用 '/langversion:?' 來列出支援的數值。
- CS1638:「 識別碼」為保留識別碼,若使用 ISO 語言版本模式時無法使用
- CS1738: 命名參數規範必須在所有固定參數都被指定後出現。請使用 7.2 或更高版本的語言,允許非尾隨的命名參數。
- CS8021: 未找到 RuntimeMetadataVersion 值。未找到包含 System.Object 的組合語言,也未透過選項指定 RuntimeMetadataVersion 的值。
- CS8022: 此功能無法在 C# 1 中提供。請使用語言版本2或更高版本。
- CS8023: 此功能無法在 C# 2 中使用。請使用語言版本3或更高版本。
- CS8024: 此功能無法在 C# 3 中提供。請使用語言版本 4 或更高版本。
- CS8025: 此功能無法在 C# 4 中使用。請使用語言版本 5 或更高版本。
- CS8026: 此功能在 C# 5 中不可用。請使用語言版本 6 或更高版本。
- CS8058: 功能「feature」為實驗性且未支援;請使用 '/features:feature' 來啟用。
- CS8059: 此功能在 C# 6 中無法使用。請使用語言版本 7 或更高版本。
- CS8107: 此功能在 C# 7.0 中無法使用。請使用語言版本 7.1 或更高版本。
- CS8192:提供的語言版本不受支援或無效:'value'。
- CS8302: 此功能無法在 C# 7.1 中提供。請使用語言版本 7.2 或更高版本。
- CS8303: 指定語言版本的「value」不能有前置零
- CS8304: 編譯器版本:「版本」。語言版本:版本。
- CS8305:「 類型」僅供評估用途,未來更新中可能會變更或移除。
- CS8306:已推斷出元組元素名稱「name」。請使用語言版本 7.1 或更新版本,才能透過其推斷名稱存取元素。
- CS8314:在 C# 'version' 版中,類型為 'type' 的運算式無法由類型為 'type' 的模式處理。請使用 'version' 或更新版本的語言版本。
- CS8320: 此功能在 C# 7.2 中無法使用。請使用語言版本 7.3 或更高版本。
- CS8370: 此功能在 C# 7.3 中不可使用。請使用語言版本 8 或更高版本。
- CS8371:語言版本 7.3 不支援自動屬性上套用至欄位的屬性。請使用語言版本 8.0 或更新版本。
- CS8400: 此功能在 C# 8 中無法使用。請使用語言版本9或更高版本。
- CS8401: 若要使用「@$」取代插值的逐字字串「$@」,請使用語言版本 8.0 或更高版本。
- CS8511:類型為 'type' 的運算式無法由類型為 'type' 的模式處理。請使用語言版本 'version' 或更新版本,才能使用常數模式比對開放型別。
- CS8627: 除非使用語言版本「version」或更高版本,否則必須知道可空型態參數為值型別或非空值參考型別。考慮更改語言版本或新增「類別」、「結構體」或型別約束。
- CS8630:C # 版本的 'option' 值無效。請使用語言版本「版本」或更高版本。
- CS8652: 此功能目前處於預覽階段,尚未支援。要使用預覽功能,請使用「預覽」語言版本。
- CS8701: 目標執行環境不支援預設介面實作。
- CS8702: 因為目標執行時不支援預設介面實作,『member』無法實作 'type' 型別的介面成員。
- CS8703:在 C# 版本中,修飾符「modifier」對此項目不適用。請使用語言版本 8.0 或以上。
- CS8704:'type' 未實作介面成員 'member'。'type' 無法在 C# 版本中隱含實作非公用成員。請使用語言版本 'version' 或更新版本。
- CS8706: Type 無法實作 type 中的介面成員,因為 C# 7.3 沒有此功能。
- CS8707: 目標執行時不支援介面成員的「受保護」、「受保護內部」或「私有保護」存取。
- CS8773: 此功能在 C# 9 中無法使用。請使用語言版本 10 或以上。
- CS8830: 目標執行時不支援覆寫中的協變回傳類型。回傳類型必須是 'type',以匹配被覆寫的成員 'member'。
- CS8831:目標執行階段不支援覆寫中的共變型別。型別必須是 'type',以符合被覆寫的成員 'member'。
- CS8888:「 受管」呼叫慣例不能與非受管呼叫慣例的指定符結合使用。
- CS8889: 目標執行時不支援可擴充或執行環境的預設呼叫慣例。
- CS8890: 類型未定義。
- CS8891:型 別「類型」必須是公開的,才能用作呼叫慣例。
- CS8904: 變異數無效:型別參數必須在「成員」上保持不變有效,除非使用語言版本 9.0 或更高版本。
- CS8912:C # 9.0 不支援從封存的「Object.ToString」紀錄繼承。請使用語言版本 10.0 或更高版本。
- CS8919: 目標執行時不支援介面中的靜態抽象成員。
- CS8929:'method' 無法實作類型 'type' 中的介面成員 'member',因為目標執行階段不支援介面中的靜態抽象成員。
- CS8936: 此功能在 C# 10 中無法使用。請使用語言版本 11 或更高版本。
- CS8957: 在語言版本 8.0 中,條件表達式不適用,因為在「類型」與「型別」之間未找到共同型別。若要使用目標型別轉換,請升級至 9.0 或更高版本。
- CS8967:C # 10.0 不支援非逐字插值字串內的換行。請使用語言版本 11.0 或更高版本。
- CS9014: 使用可能未指派的自動實作屬性「name」。考慮更新到語言版本的 'version',以自動預設該屬性。
- CS9015:使用了可能尚未指派的欄位 'name'。請考慮更新至語言版本 'version',以自動將該欄位設為預設值。
- CS9016: 使用可能未指派的自動實作屬性「name」。考慮更新到語言版本的 'version',以自動預設該屬性。
- CS9017:使用了可能尚未指派的欄位 'name'。請考慮將語言版本更新為 'version',以自動將該欄位設為預設值。
- CS9041: 'type' 需要編譯器功能「feature」,但此版本 C# 編譯器不支援此功能。
- CS9058: 此功能無法在 C# 11 中提供。請使用語言版本 12 或更高版本。
- CS9064: 目標執行時不支援參考欄位。
- CS9103:「 類型」定義於一個模組中,其 RefSafetyRulesAttribute 版本未被識別,預期為「11」。
- CS9171: 目標執行時不支援內嵌陣列類型。
- CS9194: 論證不可使用「ref」關鍵字通過。要將「ref」參數傳給「in」參數,請升級到語言版本 12 或更高。
- CS9202: 此功能在 C# 12.0 中無法使用。請使用語言版本 13 或更高版本。
- CS9204:「 類型」僅供評估用途,未來更新中可能會變更或移除。請暫緩此診斷以繼續進行。
- CS9211:對 「Experimental」屬性的 diagnosticId 參數必須是有效的識別碼。
- CS9240:目標執行階段不支援類似依參考傳遞的泛型。
- CS9260: 此功能在 C# 13.0 中無法使用。請使用語言版本 14 或更高版本。
- CS9268:「 類型」僅供評估用途,未來更新中可能會更改或移除:「訊息」。請暫緩此診斷以繼續進行。
- CS9269: UnscopedRefAttribute 僅適用於 C# 11 或更新版本,或針對 net7.0 或更新版本時。
- CS9271:型別 'Microsoft.CodeAnalysis.EmbeddedAttribute' 必須為非泛型、internal、非 file、sealed、非 static、具有不含參數的建構函式、繼承自 System.Attribute,且可套用至任何型別。
- CS9327: 此功能在 C# 14.0 中無法使用。請使用語言版本「版本」或更高版本。
- CS9328: 方法「方法」使用了一個目前執行時非同步不支援的功能。若透過「System.Runtime.CompilerServices.RuntimeAsyncMethodGenerationAttribute(false)」歸屬該方法,選擇退出執行時非同步。
- CS9346:更新需要產生明確介面實作,但若不重新啟動應用程式,執行階段不支援此作法。
- CS9352: 目標執行時不支援擴充版面型態。
這些錯誤和警告背後的原因,是編譯器或執行時不支援你使用的某個功能。 解決方法取決於問題是語言版本設定問題、語言版本不符、執行時間限制,或是實驗性功能。
語言版本設定錯誤
- CS1617: /langversion 的選項無效。使用 '/langversion:?' 來列出支援的數值。
- CS1638:「 識別碼」為保留識別碼,若使用 ISO 語言版本模式時無法使用
- CS8192:提供的語言版本不受支援或無效:'value'。
- CS8303: 指定語言版本的「value」不能有前置零
- CS8304: 編譯器版本:「版本」。語言版本:版本。
這些錯誤表示 <LangVersion> 你的專案檔案或 -langversion 編譯器選項中的設定與已安裝的編譯器無效或不相容。
將專案檔案中的值校正 <LangVersion> 為有效的語言版本字串(CS1617、 CS8192、 CS8303)。 有效值包括 default、latest、preview、latestMajor,或特定版本號碼,例如 7.3、8.0、9.0、10、11、12、13 或 14。 版本號中不要包含前置零。 完整支援值清單請參閱 C# 語言版本管理 。
Tip
若要查看支援的語言版本清單,請參考本文中的表格,或在建置前先編譯 -langversion:?至 ,或暫時設定 <LangVersion>?</LangVersion> 在專案檔案中。
將 .NET SDK 更新到支援你指定語言版本的編譯器版本(CS8304)。 每個版本的 C# 編譯器支援語言版本,最高可達特定上限。 如果你指定了比編譯器支援的新語言版本,請升級 SDK。
移除雙底線識別項,或將語言版本從 ISO-1 或 ISO-2 變更新版(CS1638)。 ISO 語言模式保留包含 __ (雙重底線)的識別碼,因為它們不符合 ISO C# 規範。
Note
目前的 C# 編譯器已不再產生 CS1638。 舊版編譯器在使用 ISO-1 OR ISO-2 語言版本時會產生此錯誤。
編譯器會根據目標框架決定其預設語言版本:
| 標的 | 版本 | C# 語言版本預設值 |
|---|---|---|
| .NET | 11.x | C# 15 |
| .NET | 10.x | C# 14 |
| .NET | 9.x | C# 13 |
| .NET | 8.x | C# 12 |
| .NET | 7.x | C# 11 |
| .NET | 6.x | C# 10 |
| .NET | 5.x | C# 9.0 |
| .NET 核心 | 3.x | C# 8.0 |
| .NET 核心 | 2.x | C# 7.3 |
| .NET Standard | 2.1 | C# 8.0 |
| .NET Standard | 2.0 | C# 7.3 |
| .NET Standard | 1.x | C# 7.3 |
| .NET Framework | 全部 | C# 7.3 |
如果你從專案檔案中移除該 LangVersion 元素,編譯器會使用目標框架的預設元素。 您也可以指定特定版本以啟用新功能:
| 值 | 意義 |
|---|---|
preview |
編譯器會接受最新預覽版本的所有有效語言語法。 |
latest |
編譯器會接受編譯器最新已發行版本 (包括次要版本) 的語法。 |
latestMajor或 default |
編譯器會接受編譯器最新已發行主要版本的語法。 |
15.0 |
編譯器僅接受包含在 C# 15 或更低版本的語法。 |
14.0 |
編譯程式只接受 C# 14 或更低版本中包含的語法。 |
13.0 |
編譯器只接受 C# 13 或更低版本中所含的語法。 |
12.0 |
編譯器只接受 C# 12 或更低版本中所含的語法。 |
11.0 |
編譯器只接受 C# 11 或更低版本中所含的語法。 |
10.0 |
編譯器只接受 C# 10 或更低版本中所含的語法。 |
9.0 |
編譯器只接受 C# 9 或更低版本中所含的語法。 |
8.0 |
編譯器只會接受 C# 8.0 或更低版本中所含的語法。 |
7.3 |
編譯器只會接受 C# 7.3 或更低版本中所含的語法。 |
7.2 |
編譯器只會接受 C# 7.2 或更低版本中所含的語法。 |
7.1 |
編譯器只會接受 C# 7.1 或更低版本中所含的語法。 |
7 |
編譯器只會接受 C# 7.0 或更低版本中所含的語法。 |
6 |
編譯器只會接受 C# 6.0 或更低版本中所含的語法。 |
5 |
編譯器只會接受 C# 5.0 或更低版本中所含的語法。 |
4 |
編譯器只會接受 C# 4.0 或更低版本中所含的語法。 |
3 |
編譯器只會接受 C# 3.0 或更低版本中所含的語法。 |
ISO-2或 2 |
編譯器只接受 ISO/IEC 23270:2006 C# (2.0) 中所含的語法。 |
ISO-1或 1 |
編譯器只接受 ISO/IEC 23270:2003 C# (1.0/1.2) 中所含的語法。 |
欲了解更多支援各框架版本的語言版本,請參閱語言參考章節中的 「配置語言版本 」。
語言版本中未提供此功能
- CS1738:指定所有固定引數之後,必須顯示具名引數規格。
- CS8022、CS8023、CS8024、CS8025、CS8026、CS8059、CS8107、CS8302、CS8320、CS8370、CS8400、CS8773、CS8936、CS9058、CS9202、CS9260、CS9327: 此功能在 C# X 中不可使用。請使用語言版本 Y 或更高版本。
- CS8306: 推斷元組元素名稱。請使用語言版本 7.1 或更高版本,才能依據推斷的名稱存取元素。
- CS8314:在 C# 'version' 版中,型別為 'type' 的運算式無法由型別為 'type' 的模式處理。請使用語言版本 'version' 或更新版本。
- CS8371:語言版本 7.3 不支援自動屬性上以欄位為目標的屬性。
- CS8401: 若要使用「@$」取代插值的逐字字串「$@」,請使用語言版本 8.0 或更高版本。
- CS8511:型別為 'type' 的運算式無法由型別為 'type' 的模式處理。請使用語言版本 'version' 或更新版本,才能以常數模式比對開放型別。
- CS8627: 除非使用語言版本「version」或更高版本,否則必須知道可空型態參數為值型別或非空值參考型別。考慮更改語言版本或新增「類別」、「結構體」或型別約束。
- CS8630:C # 版本的 'option' 值無效。請使用語言版本「版本」或更高版本。
- CS8703:在 C# 版本中,修飾符「modifier」對此項目不適用。
- CS8704:「 類型」未實作介面成員「成員」。「類型」無法隱含實作非公開成員。
- CS8706: 類型無法實作介面成員,因為此版本無法提供此功能。
- CS8904: 變異數無效:型別參數必須在「成員」上保持不變有效,除非使用語言版本 9.0 或更高版本。
- CS8912:C # 9.0 不支援從封存的「Object.ToString」紀錄繼承。
- CS8957: 在語言版本 8.0 中,條件表達式不適用,因為在類型間未找到共同型別。
- CS8967:C # 10.0 不支援非逐字插值字串內的換行。
- CS9194: 論證不可使用「ref」關鍵字通過。要將「ref」參數傳給「in」參數,請升級到語言版本 12 或更高。
這些錯誤都表示你使用的語言功能需要比專案目前目標更新的 C# 版本。 要解決這些錯誤,請使用以下選項之一:
升級目標框架,讓編譯器自動選擇所需的語言版本。 每個目標框架對應到預設的 C# 版本。 例如,.NET 8 預設為 C# 12,.NET 9 預設為 C# 13,而 .NET 10 預設為 C# 14。 完整對應資料請參閱 語言版本配置錯誤 表。
在專案檔案中設定
<LangVersion>元素為所需版本或更高版本。 例如,要啟用 C# 12 功能,可以在你的專案檔案中新增<LangVersion>12</LangVersion>a<PropertyGroup>。
如果無法升級,請避免觸發錯誤的功能。 錯誤訊息會標明該功能及所需版本。 以下列表提供特定錯誤的額外背景說明:
- 對所有引數明確指定名稱,或升級至 C# 7.2 或更新版本,以使用非尾隨具名引數(CS1738)。
- 存取元組元素時,請依據宣告名稱而非推斷名稱,或升級至 C# 7.1 或更新版本(CS8306)。
- 在 C# 8.0 之前的版本中,對於插補逐字字串,請使用
$@"..."而非@$"..."(CS8401)。 - 可對可空型態參數新增明確型別約束,或升級至 C# 9 或更新版本以放寬此要求(CS8627)。
- 升級至 C# 8.0 或更新版本以啟用可空標註及可空上下文(CS8630)。
- 在條件表達式中加入明確的鑄造,當兩個分支沒有共同型別時,或升級到 C# 9 或更新版本以滿足目標型別條件表達式(CS8957)。
- 將換行移到插值字串運算式之外,或升級至 C# 11 或更高版本(CS8967)。
- 將引數傳遞給
in參數時,請使用in關鍵字,而不要使用ref;或升級至 C# 12 或更新版本(CS9194)。 - 請明確實作非公開介面成員,而非以隱含方式實作,或升級至 C# 9 或更高版本(CS8704)。
目標執行時不支援此功能
- CS8021: 未找到 RuntimeMetadataVersion 值。
- CS8701: 目標執行環境不支援預設介面實作。
- CS8702:因為目標執行階段不支援預設介面實作,所以 'member' 無法在型別中實作介面成員。
- CS8707: 目標執行時不支援介面成員的「受保護」、「受保護內部」或「私有保護」存取。
- CS8830: 目標執行時不支援覆寫中的協變回傳類型。
- CS8831: 目標執行時不支援覆寫中的協變型別。
- CS8889: 目標執行時不支援可擴充或執行環境的預設呼叫慣例。
- CS8919: 目標執行時不支援介面中的靜態抽象成員。
- CS8929:'method' 無法在類型 'type' 中實作介面成員 'member',因為目標執行階段不支援介面中的靜態抽象成員。
- CS9041: 'type' 需要編譯器功能「feature」,但此版本 C# 編譯器不支援此功能。
- CS9064:目標執行階段不支援 ref 欄位。
- CS9103:「 類型」定義於一個模組中,其 RefSafetyRulesAttribute 版本未被識別,預期為「11」。
- CS9171:目標執行階段不支援內嵌陣列型別。
- CS9240:目標執行階段不支援 by-ref-like 泛型。
- CS9328: 方法「方法」使用了一個目前執行時非同步不支援的功能。若透過「System.Runtime.CompilerServices.RuntimeAsyncMethodGenerationAttribute(false)」歸屬該方法,選擇退出執行時非同步。
- CS9346:更新需要產生明確介面實作,而執行階段若不重新啟動應用程式則不支援此功能。
- CS9352: 目標執行時不支援擴充版面型態。
這些錯誤與語言版本錯誤不同,因為僅升級 <LangVersion> 版本無法解決。 目標執行時(由 <TargetFramework>指定)也必須在 CLR/執行階段層級支援此功能。
在專案檔案中升級 <TargetFramework> 到支援所需功能的版本。 以下列表顯示哪些功能需要哪個最短執行時間:
- 預設介面實作,包括受保護存取(
CS8701 、 CS8702 、CS8707 ):需要.NET核心 3.0 / .NET 5+。 - 介面中的靜態抽象成員(CS8919,CS8929):需要.NET 7+。
- 協變回傳類型(CS8830,CS8831):需要.NET 5+。
- 參考欄位(CS9064):需要.NET 7+。
- 內聯陣列類型(CS9171):需要.NET 8+。
- 類似依參考傳遞的泛型(CS9240):需要 .NET 9 或更新版本。
- 擴展版面類型(CS9352):需要.NET 10+。
- 可擴充呼叫慣例(CS8889):需要 .NET 5+。
- 執行時非同步功能(CS9328):需要.NET 10+。
如果編譯器本身不支援必要的編譯器功能(
確保有有效的核心執行時函式庫參考(CS8021)。 此警告通常會在未使用標準執行階段參考進行建置時出現。 指定 RuntimeMetadataVersion 選項,或新增對包含 System.Object 的組件之參考。
透過使用相容的編譯器版本重新編譯相依模組,解決 RefSafetyRulesAttribute 版本不相符的問題(CS9103)。
如果在熱重載(CS9346)時遇到錯誤,請重新啟動應用程式。 有些編輯後繼續的變更需要重新啟動,因為執行時無法動態輸出所需的明確介面實作。
函式指標與呼叫慣例錯誤
- CS8888:「 受管」呼叫慣例不能與非受管呼叫慣例的指定符結合使用。
- CS8889: 目標執行時不支援可擴充或執行環境的預設呼叫慣例。
- CS8890: 類型未定義。
- CS8891:型別 'type' 必須是公用,才能用作呼叫慣例。
這些錯誤與 函式指標 宣告及其呼叫慣例規範符有關,這些定義在 C# 9 中被引入。
移除managed包含未管理規範符的慣例清單(CS8888)。
managed呼叫慣例是預設,不能與 unmanaged 、 Cdecl、 Stdcall、 Thiscall或 等指定詞Fastcall合併使用。
將目標框架升級至 .NET 5 或更新版本,以使用可擴充或執行時預設呼叫慣例(CS8889)。
UnmanagedCallersOnly 屬性與可擴充呼叫慣例需要執行時支援,而 Core 3.1 或更早版本.NET此支援無法提供。
確保呼叫慣例類型存在於參考的組件中(CS8890)。 呼叫慣例 CallConvCdecl類型如 、 CallConvStdcall、 CallConvThiscall、 CallConvFastcall 定義於 System.Runtime.CompilerServices中。 如果找不到該型別,請加入正確的執行時函式庫參考。
建立自訂呼叫慣例類型 public (CS8891)。 如果您定義了自訂呼叫慣例型別,請將其宣告為 public,以便在函式指標型別宣告中使用。
實驗性與預覽功能
- CS8058: 功能「feature」為實驗性且未支援;請使用 '/features:feature' 來啟用。
- CS8305:「 類型」僅供評估用途,未來更新中可能會變更或移除。
- CS8652: 此功能目前處於預覽階段,尚未支援。要使用預覽功能,請使用「預覽」語言版本。
- CS9204:「 類型」僅供評估用途,未來更新中可能會變更或移除。請暫緩此診斷以繼續進行。
- CS9211:'Experimental' 屬性的 diagnosticId 引數必須是有效的識別碼。
- CS9268:「 類型」僅供評估用途,未來更新中可能會更改或移除:「訊息」。請暫緩此診斷以繼續進行。
這些診斷表示你使用的功能或類型標示為實驗性,或僅在預覽語言版本中提供。
警告
實驗功能可能會變更。 API 可能會改變,或在未來更新中被移除。 包含實驗性功能是程式庫作者針對未來開發取得想法和概念意見反應的一種方式。 使用標示為實驗性的任何功能時,請特別小心。
在專案檔案中設定 <LangVersion>preview</LangVersion> 使用預覽語言功能(CS8652)。 預覽功能尚未最終定案,未來版本可能會有所變動。
抑制特定診斷識別碼以確認 API 的實驗性質(CS8058、 CS8305、 CS9204、 CS9268)。 函式庫作者會標記 API System.Diagnostics.CodeAnalysis.ExperimentalAttribute ,表示它們可能會變更。 你可以透過使用 #pragma warning disable 或在專案檔案中加入診斷 ID <NoWarn> 來抑制診斷。
確保 diagnosticId 的 [Experimental] 參數是有效的 C# 識別碼(CS9211)。 識別碼必須遵循標準命名規則。 它不能包含空格、特殊字元,也不能以數字開頭。 你也可以透過使用 System.Diagnostics.CodeAnalysis.ExperimentalAttribute. 來宣告你自己的實驗特徵。
結構初始化的重大變更
- CS0171,CS8881:欄位 'name' 必須在控制權傳回給呼叫端之前完成完整指派。請考慮更新為語言版本 'version',以自動為該欄位指派預設值。
- CS0188, CS8885: 在所有欄位都被指派之前,『this』物件無法使用。考慮更新到語言版本的 'version',以自動預設未指派欄位。
- CS0843、 CS8880: 自動實作屬性「name」必須完全指派,才能將控制權交還給呼叫者。考慮更新到語言版本的 'version',以自動預設該屬性。
- CS9014: 使用了可能尚未指派的自動實作屬性 'name'。請考慮將語言版本更新為 'version',以讓該屬性自動採用預設值。
- CS9015:使用了可能尚未指派的欄位 'name'。請考慮將語言版本更新為 'version',以自動為該欄位指派預設值。
- CS9016:使用了可能尚未指派的自動實作屬性「name」。請考慮更新至語言版本 'version',讓該屬性自動採用預設值。
- CS9017:使用了可能尚未指派的欄位 'name'。請考慮更新至語言版本 'version',以自動將該欄位設為預設值。
這些錯誤與警告有助於確保 struct 類型在存取欄位前已正確初始化。 在舊版 C# 中,您必須在任何建構函式中明確指派結構中的所有欄位。 無參數建構函式會將所有欄位初始化成其預設值。 在後續版本中所有建構函式均會初始化所有欄位。 欄位可以有以下三種設定方式:明確設定、在欄位初始化設定式中設定,或是設定為預設值。
升級至 C# 11 或更新版本,使所有struct建構程式自動預設所有欄位(CS0171、CS0188、CS0843,以及較新的 CS8880、CS8881、CS8885)。 從 C# 11 開始,編譯器會自動將建構器中未明確設定的欄位初始化為預設值。
如果你無法升級到 C# 11(: this()、CS0188、CS0843),可以在你的結構體建構器中明確呼叫預設建構子。 此方法確保所有欄位在建構器本體執行前已收到預設值:
struct S
{
public int AIProp { get; set; }
public S(int i) : this() // Ensures all fields are initialized
{
AIProp = i;
}
}
在使用 this 建構子返回前或之前,將所有欄位與自動屬性指派(CS9014、 CS9015、 CS9016、 CS9017)。 當較新的編譯器偵測到你可能在屬性或欄位尚未指派前讀取時,就會產生這些診斷。 要麼明確指定一個數值,要麼升級到自動預設能消除警告的版本。
實作專屬屬性
- CS9269: UnscopedRefAttribute 僅適用於 C# 11 或更新版本,或以 net7.0 或更新版本為目標時有效。
- CS9271:型態為Microsoft。CodeAnalysis.EmbeddedAttribute' 必須非通用、內部、非檔案、封存、非靜態,擁有無參數建構子,繼承自 System.Attribute,且能套用於任何類型。
這些錯誤與編譯器產生或綁定於特定執行版本的屬性有關。
升級到 C# 11 及 .NET 7 或更高版本,以使用 UnscopedRefAttribute(CS9269)。 此屬性表示,ref 傳回值或 ref struct 參數不具有作用域存留期。 它要求語言版本與目標框架同時符合最低要求。
不要手動宣告 Microsoft.CodeAnalysis.EmbeddedAttribute(CS9271)。 編譯器會在需要時自動產生此屬性的原始碼。 如果你有手動宣告且使用此名稱的型別,請將其移除或重新命名,以避免與編譯器產生的版本發生衝突。