解決與語言功能和版本相關的警告
本文涵蓋下列編譯器警告:
- CS8022, CS8023, CS8024, CS8025, CS8026, CS8059, CS8107, CS8302, CS8320, CS8370, CS8400, CS8773, CS8936, CS9058:無法使用功能。使用較新的語言版本。
- CS8058:功能是實驗性的。
- CS8192:不支援提供的語言版本或該版本無效
- CS8303:指定的語言版本不可以將零作為開頭
- CS8304:編譯器版本小於語言版本
- CS1738:指定所有固定引數之後,必須顯示具名引數規格。
- CS8306:推斷 Tuple 元素名稱。
- CS8314:型別的模式無法處理型別的運算式
- CS8371:語言版本不支援自動屬性 (property) 上以欄位為目標的屬性 (attribute)
- CS8401:若要在插入的逐字字串使用
@$
,而不是$@
,請使用較新的語言版本。 - CS8511:型別模式無法處理型別運算式。
- CS8627:可為 Null 的型別參數必須已知為實值型別或不可為 Null 的參考型別
- CS8630:無效的可為 Null 選項。使用較新的語言版本
- CS8652:修飾元對此項目無效。
- CS8704:型別未實作介面成員。其無法隱含實作非公用成員。
- CS8706:因為此版本中的功能無法使用,型別無法實作介面成員。
- CS8904:無效變異數:型別參數必須有效。
- CS8912:不支援自具有密封 'Object.ToString' 的記錄繼承。
- CS8919:因為目標執行階段不支援介面中靜態抽象成員,所以無法在型別中實作指定介面成員
- CS8929:因為目標執行階段不支援介面中靜態抽象成員,所以方法無法在型別中實作介面成員。
- CS8957:因為在型別之間找不到一般型別,條件運算式在語言版本中無效。
- CS8967: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 中無法使用功能。請使用較新的語言版本*
此外,下列錯誤和警告與最新版本的結構初始化變更有關:
- CS0171、CS8881:在控制項傳回到呼叫端前,必須完整指派自動實作的屬性 'name' 的支援欄位。
- CS0188、CS8885:指定其所有欄位前,無法使用 'this' 物件
- CS0843、CS8880:在控制項傳回到呼叫端前,必須完整指派自動實作的屬性 'name' 的支援欄位
- CS8305:功能僅供評估之用,後續更新時可能會有所變更或移除。
- CS9204:型別僅供評估之用,後續更新時可能會有所變更或移除。隱藏此診斷以繼續進行。
所有這些錯誤和警告實際上是因為,已安裝的編譯器支援比您專案所選的版本更新的 C# 版本。 C# 編譯器可符合任何舊版。 您可以驗證舊版 C# 語法,或因為您的專案必須支援較舊的程式庫或執行階段。
有兩種可能的原因和三種方式可解決這些錯誤和警告。
更新目標 Framework
編譯器會根據下列規則決定預設值:
Target | 版本 | C# 語言版本預設值 |
---|---|---|
.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 Core | 3.x | C# 8.0 |
.NET Core | 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 |
如果您選取的架構不符合所需的語言版本,您可以升級目標 Framework。
請選取相符的語言版本
您可能已在專案檔中選取較舊的目標 Framework。 如果您從專案檔中移除 LangVersion
元素,編譯器將會使用上一節中所列的預設值。 下表顯示所有目前的 C# 語言版本。 您也可以指定特定語言版本啟用較新的功能。
值 | 意義 |
---|---|
preview |
編譯器會接受最新預覽版本的所有有效語言語法。 |
latest |
編譯器會接受編譯器最新已發行版本 (包括次要版本) 的語法。 |
latestMajor 或 default |
編譯器會接受編譯器最新已發行主要版本的語法。 |
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;
}
}