本文涵蓋下列編譯器警告:
- CS8022, CS8023, CS8024, CS8025, CS8026, CS8059, CS8107, CS8302, CS8320, CS8370, CS8400, CS8773, CS8936, CS9058:無法使用功能。使用較新的語言版本。
- CS8058:功能是實驗性的。
- CS8192:不支援提供的語言版本或該版本無效
- CS8303:指定的語言版本不可以將零作為開頭
- CS8304:編譯器版本小於語言版本
- CS1738:指定所有固定引數之後,必須顯示具名引數規格。
- CS8306:Tuple 元素名稱是推斷而來的。
- CS8314:類型模式無法處理該類型的運算式
- CS8371:語言版本不支援自動屬性上以欄位為目標的屬性
-
CS8401:若要在插入的逐字字串使用
@$,而不是$@,請使用較新的語言版本。 - CS8511: 型別的運算式無法被型別的模式處理。
- CS8627:可為 Null 的型別參數必須已知為實值型別或不可為 Null 的參考型別
- CS8630:無效的可空性選項。請使用較新的語言版本
- CS8652:修飾元對此項目無效。
- CS8704:型別未實作介面成員。其無法隱含實作非公用成員。
- CS8706:因為某功能在此版本中無法使用,故該型別無法實作介面成員。
- CS8904:無效變異數:型別參數必須有效。
- CS8912:不支援自具有密封 'Object.ToString' 的記錄繼承。
- CS8919:因為目標執行階段不支援介面中靜態抽象成員,所以無法在型別中實作指定介面成員
- CS8929:因為目標執行階段不支援介面中靜態抽象成員,所以方法無法在型別中實作介面成員。
- CS8957:因為在不同型別之間找不到共同型別,條件運算式在語言版本中無效。
- CS8967:C# 不支援非逐字差補字串內的新行
- CS9041: 需要本版本 C# 編譯器不支援的編譯器功能。
- CS9014:錯誤:使用可能未指派的屬性。升級為自動預設屬性。
- CS9015:錯誤:使用可能未指派的欄位。升級以自動設定為預設值。
- CS9016:警告:使用可能未指派的屬性。升級為自動預設屬性。
- CS9017:警告:使用可能未指派的欄位。升級至自動預設欄位。
- CS9064:目標執行階段不支援 ref 欄位。
- CS9103:在無法辨識的 RefSafetyRulesAttribute 版本模組中定義,期望版本為 '11'。
- CS9171:目標執行階段不支援內嵌陣列型別。
-
CS9194:可能無法使用
ref關鍵字傳遞引數。若要將ref引數傳遞至in參數,請升級至語言版本 12 或更新版本。 - CS9202:無法在 C# 12.0 中使用功能。請使用較新的語言版本
- CS9211:'Experimental' 屬性的 diagnosticId 引數必須是有效的識別碼。
- CS9240:目標執行階段不支援 by-ref-like 泛型。
- CS9260: C# 13.0 中無法使用功能。請使用較新的語言版本*
- CS9268: 類型僅供評估之用,未來更新可能會變更或移除。隱藏此診斷以繼續進行。
- CS9269: UnscopedRefAttribute 僅適用於 C# 11 或更新版本,或以 net7.0 或更新版本為目標時有效。
-
CS9271: 類型 '
Microsoft.CodeAnalysis.EmbeddedAttribute' 必須是非泛型、內部、密封、非靜態、具有無參數建構函式、繼承自 System.Attribute,而且能夠套用至任何類型。 - CS9327: 此功能在 C# 14.0 中無法使用。使用較新的語言版本。
- CS9328: 方法使用執行階段非同步目前不支援的功能。
此外,下列錯誤和警告與最新版本的結構初始化變更有關:
- CS0171、CS8881:在返回控制權給呼叫端之前,必須完整指派自動實作的屬性 'name' 的支援欄位。
- CS0188、CS8885:在指定所有欄位之前,無法使用 'this' 物件
- CS0843、CS8880:在控制項傳回到呼叫端前,必須完整指派自動實作的屬性 'name' 的支援欄位
- CS8305:功能僅供評估之用,後續更新時可能會有所變更或移除。
- CS9204:型別僅供評估之用,後續更新時可能會有所變更或移除。隱藏此診斷以繼續進行。
所有這些錯誤和警告實際上是因為,已安裝的編譯器支援比您專案所選的版本更新的 C# 版本。 C# 編譯器可符合任何舊版。 您可以驗證舊版 C# 語法,或因為您的專案必須支援較舊的程式庫或執行階段。
有兩種可能的原因和三種方式可解決這些錯誤和警告。
更新目標框架
編譯器會根據下列規則決定預設值:
| 標的 | 版本 | 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 元素,編譯器將會使用上一節中所列的預設值。 下表顯示所有目前的 C# 語言版本。 您也可以指定特定語言版本啟用較新的功能。
| 值 | 意義 |
|---|---|
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) 中所含的語法。 |
您可以在語言參考一節中的設定語言版本一文中深入瞭解每個架構版本支援的語言版本。
避免使用已更新的功能
如果必須支援較舊的程式庫或執行階段,您可能需要避免使用較新的功能。
啟用實驗性功能
您可以停用實驗功能的診斷,以使用實驗性功能。
警告
實驗性功能可能會有所變更。 API 可能會變更,或在未來的更新中可能會移除它們。 包含實驗性功能是程式庫作者針對未來開發取得想法和概念意見反應的一種方式。 使用標示為實驗性的任何功能時,請特別小心。
您也可以使用 System.Diagnostics.CodeAnalysis.ExperimentalAttribute 來宣告自己的實驗性功能。 如果用於實驗性功能的識別碼不是有效的識別碼,則編譯器就會發出 CS9211。
結構初始化的重大變更
所有這些錯誤和警告均有助於確保 struct 型別在存取欄位前已正確初始化。 在舊版 C# 中,您必須在任何建構函式中明確指派結構中的所有欄位。 無參數建構函式會將所有欄位初始化成其預設值。 在後續版本中所有建構函式均會初始化所有欄位。 欄位可以有以下三種設定方式:明確設定、在欄位初始化設定式中設定,或是設定為預設值。
- CS0171、CS8881:自動實作屬性 'name' 的輔助欄位必須在將流程控制傳回至呼叫端前完全指派。
- CS0188、CS8885:指定其所有欄位前,無法使用 'this' 物件
- CS0843、CS8880:在控制返回給呼叫者之前,必須完整地指派自動實作屬性 'name' 的後備欄位
您可以將語言版本升級至 C# 11 來解決此錯誤,每個 struct 建構函式都會初始化所有欄位。 如果這不是可行的選項,您必須明確呼叫預設建構函式,如下列範例所示:
struct S
{
public int AIProp { get; set; }
public S(int i){} //CS0843
// Try the following lines instead.
// public S(int i) : this()
// {
// AIProp = i;
// }
}
class Test
{
static int Main()
{
return 1;
}
}
實作特定屬性
-
CS9271: 類型 '
Microsoft.CodeAnalysis.EmbeddedAttribute' 必須是非泛型、內部、密封、非靜態、具有無參數建構函式、繼承自 System.Attribute,而且能夠套用至任何類型。
當您的原始程式碼需要時,編譯程式會產生此屬性的來源。 您不應該宣告此類型。