共用方式為


解決字串文字宣告的錯誤與警告

當你宣告語法錯誤的字串文字或在不支援的情境中使用字串時,C# 編譯器會產生錯誤和警告。 這些診斷工具能幫助你辨識基本字串字面值、字元字面值、原始字串字面值以及 UTF-8 字串字面值的問題。

  • CS1009無法辨識的逸出序列。
  • CS1010常數換行符。
  • CS1011空的字元文字。
  • CS1012字元文字中的字元太多。
  • CS1039未終止的字串文字常數。
  • CS8996:在預處理器指令中不允許使用原始字串文字。
  • CS8997未終止的原始字串常值。
  • CS8998此原始字串內容的起始引號不足。
  • CS8999行的開頭空白不符合原始字串常值結束行的空白。
  • CS9000原始字串字面值定界符必須位於自己的行上。
  • CS9001多行原始字串文字僅允許用於逐字插值字串中。
  • CS9002多行原始字串文字必須至少包含一行內容。
  • CS9003行包含與預期不同的空格。
  • CS9004原始字串常值的引號不足。
  • CS9005內插原始字串常值的右大括弧不足。
  • CS9006內插文字常值的原始字串左大括弧太多。
  • CS9007內插原始字串常值的閉合大括弧數量過多。
  • CS9008不允許使用 '@' 字元序列。
  • CS9009字串必須以引號字元開頭。
  • CS9026輸入字串無法轉換為等效的 UTF-8 位元組表示。
  • CS9047運算子無法套用於非 UTF-8 位元組表示的運算元。
  • CS9274無法將此字串常值發出至數據區段,因為它與另一個字串常值發生 XXHash128 衝突。
  • CS9315程式所使用的使用者字串總長度超過允許的限制。新增字串常值需要重新啟動應用程式。

字串常數格式不正確

  • CS1009 - 無法辨識的逸出序列。
  • CS1010 - 常數中有換行符。
  • CS1011 - 空字元文字。
  • CS1012 - 字元字面中的字元太多。
  • CS1039 - 未終止的字串。

為了修正這些錯誤,請運用以下技術:

  • 請使用 C# 語言規範中定義的標準跳脫序列之一,例如 \n (換行)、 \t (tab)、 \\ (反斜線)或 \" (雙引號)(CS1009)。 編譯器無法辨識語言規範中不包含的跳脫序列,因此使用未定義的跳脫序列會造成錯誤,因為編譯器無法判斷你想代表哪個字元。
  • 加入結尾引號字元以完成字串字面值(CS1039)。 字串字面必須同時具有開閉分隔符,因此未終止的字串會使編譯器將後續原始碼視為字串內容的一部分,進而導致解析錯誤。
  • 在字面文字(CS1011CS1012)的單引號之間加一個字元。 字元字量代表單一字元值,必須恰好包含一個字元或有效的跳脫序列,因此空字元或包含多個字元的字元會違反該 char 型別的語言規則。
  • 將跨越多行的字串文字進行拆分,在每行末尾加上結束引號,在下一行開始加上開始引號,並使用 + 運算子將它們串接起來(CS1010)。 一般字串文字不能包含真正的換行字元,因為結尾引號必須與開頭引號位於同一行。不過,你可以透過串接或使用 逐字字串原始字串來實現多行字串,這些方法允許將換行嵌入到字串內容中。

更多資訊請參見弦樂。

格式不正確的原始字串字面值

  • CS8996原始字串字面值禁止用於預處理器指令中。
  • CS8997 - 未終止的原始字串常值。
  • CS8998 - 此原始字串內容的起始引號不足。
  • CS8999 - 行的開頭空白與原始字串文字結尾行的空白不同。
  • CS9000 - 原始字串常值的分隔符號必須單獨位於一行。
  • CS9001 - 型多行原始字串常值僅允許在逐字插值字串中使用。
  • CS9002 - 多行原始字串必須至少包含一行內容。
  • CS9003 - 行包含與預期不同的空格。
  • CS9004 - 原始字串文字的引號不足。
  • CS9005 - 插值(內插)的原始字串字面值的閉合大括號不足。
  • CS9006 - 內插原始字串文字的左大括號太多。
  • CS9007 - 內插原始字串文字的右大括號太多。
  • CS9008 - 不允許使用「@」字元的序列。
  • CS9009 - 字串必須以引號字元開頭。

為了修正這些錯誤,請運用以下技術:

  • 在預處理器指令如 #if、 或 #define#pragma) 中,使用一般字串字面值或逐字字串字面值,而非原始字串字面值。 預處理器指令會在詞彙分析前的預處理階段評估,因此編譯器無法辨識這些上下文中的原始字串字面語法,因為原始字串是在後續的詞彙分析階段被識別。
  • 加入一個與開頭分隔符相符的閉結分隔符,以完成你的原始字串字面值(CS8997CS9004)。 原始字串字面語法要求開頭與結尾分隔符包含相同數量的連續雙引號字元(至少三個),因此缺少或不匹配的結尾分隔符會阻止編譯器判斷字串內容的結束。
  • 將多行原始字串字面值的開閉分隔符放在各自的行上,且不包含其他內容(CS9000)。 多行原始字串格式規則要求分隔符必須佔據專用行,以建立字串內容的明確邊界,並啟用空白裁剪行為,移除所有內容行的共同前置縮排。
  • 在多行原始字串字面值(CS9002)的開頭與閉尾分隔符之間至少加一行內容。 語言規範要求多行原始字串包含實際內容,因為空的多行原始字串毫無意義,且很可能表示程式碼不完整;而單行原始字串(同行分隔符)可以是空字串,且是空字串值的適當語法。
  • 調整原始字串內容線的縮排,使其與閉合分隔線(CS8999CS9003)的縮排相匹配或超過。 原始字串字面值的 空白處理規則 使用閉尾分隔符的前置空白作為所有內容行共同縮排的基準線,因此縮排少於閉鎖分隔符的內容行違反此裁剪演算法,顯示格式錯誤。
  • 將原始字串分隔符中的雙引號字元數量增加,以超過內容中任何連續出現的雙引號字元數(CS8998)。 分隔符必須包含比字串內容中任何序列更多的連續引號,這樣編譯器才能明確區分內容中的引號字元與標記字串結尾的分隔符序列。
  • 對於插值的原始字串文字,請確保開頭的美元符號($)數量與你需要的連續開閉大括號數量相符(CS9005CS9006CS9007)。 插值原始字串語法使用美元符號計數來決定大括號跳脫序列長度,因此$$"""需要{{插值漏洞,且允許單一{字元作為內容;而大括號序列不匹配則表示插值語法錯誤或內容需要不同的美元符號計數。
  • 從原始字串字面值中移除前 @ 綴,只使用引號字元分隔符(CS9008CS9009)。 原始字串文字是 C# 11 引入的一種獨特語法,不使用 @ 逐字字串前綴,且語言規範不允許將逐字語法與原始字串分隔符結合 @ ,因為原始字串已支援多行內容,且不需要跳脫序列。

備註

CS9001 已不再以目前版本的 C# 製作。 多行原始字串字面值現在支援插值,無需逐字格式。

更多資訊請參閱 原始字串常值

UTF-8 字串常值

  • CS9026 - 輸入字串無法轉換為等效的 UTF-8 位元組表示法。
  • CS9047操作符無法套用於非 UTF-8 字節表示的運算元。

為了修正這些錯誤,請運用以下技術:

  • 從你的 u8 字串字面值(CS9026)中移除無法用 UTF-8 編碼的字元或跳脫序列。 UTF-8 編碼規範支援完整的 Unicode 字元集,但需要有效的 Unicode 純量值,因此替代碼點(範圍為 U+D800 至 U+DFFF)無法直接出現在 UTF-8 字串中,因為它們是保留給 UTF-16 替代對編碼的,而非獨立字元,嘗試以 UTF-8 編碼會產生無效的位元組序列。
  • 在串接 UTF-8 字串時,請確保加法運算子的兩個運算元皆為以 u8 為後綴的 UTF-8 字串字面量(CS9047)。 編譯器提供特殊支援,可在編譯時串接 ReadOnlySpan<byte>,產生代表串接 UTF-8 位元組序列的值,但不支援將 UTF-8 字串與常規string值或其他類型混合,因為型別系統無法判斷是產生位元組區間還是文字字串,且底層表示方式(UTF-8 位元組與 UTF-16 字元)根本不相容。

欲了解更多資訊,請參閱 UTF-8 字串常值

資料區段中的文字字串

  • CS9274無法將此字串常值發出至資料區段,因為它與另一個字串常值有 XXHash128 衝突。
  • CS9315程式所使用的使用者字串總長度超過允許的限制。新增字串常值需要重新啟動應用程式。

要解決這些問題,請嘗試以下技巧:

  • 當您的應用程式遇到雜湊碰撞(CS9274)時,請停用實驗性資料區段的字串常值功能。 此錯誤表示兩個不同的字串常量產生相同的 XXHash128 值,導致優化無法正常運作,因此應移除能觸發此實驗行為的功能旗標。
  • 在除錯時啟用資料區段功能(CS9315)後,修改字串字面值後重新啟動應用程式。 熱重載基礎設施無法更新資料區塊中儲存的字串文字,因為它們嵌入在特殊格式中,執行時無法修改,繼續使用舊字串值會產生錯誤行為。