字符串文本声明的错误和警告

与声明字符串常量或字符串文本相关的几个错误。

  • CS1009无法识别的转义序列。
  • CS1010常量中的换行符。
  • CS1011空字符文本。
  • CS1012字符文本中的字符过多。
  • CS1039未确定的字符串文本。
  • CS8997未确定的原始字符串文本。
  • CS8998此原始字符串内容的起始引号不够。
  • CS8999行不以与原始字符串文本的结束行相同的空格开头。
  • CS9000原始字符串文本分隔符必须位于自己的行上。
  • CS9001仅在逐字内插字符串中允许多行原始字符串文本。
  • CS9002多行原始字符串文本必须至少包含一行内容。
  • CS9003行包含与预期不同的空格。
  • CS9004原始字符串文本的引号不足。
  • CS9005内插原始字符串文本的右大括号不够。
  • CS9006内插原始字符串文本的左大括号太多。
  • CS9007内插原始字符串文本的右大括号太多。
  • CS9008不允许使用“@”字符序列。
  • CS9009字符串必须以引号字符开头。
  • CS9274无法在数据节中发出此字符串文本,因为它与另一个字符串文本发生 XXHash128 冲突。
  • CS9315程序使用的用户字符串的总长度超过允许的限制。添加字符串文本需要重启应用程序。

以下部分提供了常见问题的示例以及如何解决这些问题。

格式不正确的字符串文本

以下错误涉及字符串和字符字面量语法以及声明字面值时的常见错误。

  • CS1009 - 无法识别的转义序列。
  • CS1010 - 常量中的换行符。
  • CS1011 - 空字符文本。
  • CS1012 - 字符文本中的字符过多。
  • CS1039 - 未确定的字符串文本。

常见原因和修复:

  • 无效的转义序列:反斜杠后出现了意外字符(\\)。 对包含反斜杠的内容,可以使用有效的转义(\\n, \\t, \\uXXXX, \\xX)或使用逐字文本(@"...")或原始字符串文本。
  • 空或多字符字符文本:字符文本必须正好包含一个 UTF-16 代码单元。 对 BMP 之外的字符使用单个字符(如 'x' 或字符串/ System.Text.Rune )。
  • 未确定的字符串:确保每个字符串或逐字字符串都有匹配的右引号。 对于逐字字符串,最终 " 必须存在;对于普通字符串,请确保转义引号是均衡的。
  • 字符串文本跨越多个 C# 源行。

例子

// CS1009 - invalid escape
string a = "\\m";               // CS1009 - invalid escape \m

// Use verbatim strings or escape backslashes
string filename = "c:\\myFolder\\myFile.txt"; // escaped backslashes
string filenameVerbatim = @"c:\myFolder\myFile.txt"; // verbatim string

// CS1011 - empty character literal
// public char CharField = '';   // CS1011 - invalid: empty character literal

// CS1012 - too many characters in char literal
char a = 'xx';   // CS1012 - too many characters

// CS1039 - unterminated verbatim string
// string b = @"hello, world;   // CS1039 - missing closing quote

有关文本字符串和转义序列的详细信息,请参阅有关 逐字字符串原始字符串的文章。

格式不正确的原始字符串字面值

以下错误与原始字符串文本语法和用法相关。

  • CS8997 - 未确定的原始字符串文本。
  • CS8998 - 此原始字符串内容的起始引号不足。
  • CS8999 - 行不以与原始字符串文本的结束行相同的空格开头。
  • CS9000 - 原始字符串的分隔符必须单独占一行。
  • CS9001 - 多行原始字符串文本仅在逐字内插字符串中允许使用。
  • CS9002 - 多行原始字符串文本必须至少包含一行内容。
  • CS9003 - 行包含与预期不同的空格。
  • CS9004 - 原始字符串文本的引号不足。
  • CS9005 - 内插原始字符串文本的右大括号不够。
  • CS9006 - 内插原始字符串文本的左大括号太多。
  • CS9007 - 内插原始字符串文本的右大括号太多。
  • CS9008 - 不允许使用“@”字符序列。
  • CS9009 - 字符串必须以引号字符开头。

检查以下常见的原因和解决方案:

  • 不确定或不匹配的分隔符:确保原始字符串以相同数量的连续双引号 (") 开头和结尾。 对于多行原始字符串,开始和结束分隔符行必须出现在自己的行上。
  • 缩进和空格不一致:结束分隔符的缩进定义了内容行中常见前导空格的裁减。 请确保内容行与该缩进对齐。
  • 内容引用或 $ 计数不足:如果内容以连续的引号字符或大括号字符开头,应增加分隔符的长度(更多 ")或插值原始字符串的前导 $ 字符数,以避免内容与分隔符或插值混淆。
  • 非法字符或序列:避免在逐字/原始组合时使用多个 @ 字符,并确保在将插值与多行原始字符串组合时使用逐字插值格式。

以下代码演示了一些格式不正确的原始字符串文本的示例。

// Unterminated raw string (CS8997)
var s = """This raw string never ends...

// Delimiter must be on its own line (CS9000)
var t = """First line
           More text
          """;

有关完整语法和更多示例,请参阅 原始字符串文本的语言参考

数据部分中的文本字符串

  • CS9274无法在数据节中发出此字符串文本,因为它与另一个字符串文本发生 XXHash128 冲突。
  • CS9315程序使用的用户字符串的总长度超过允许的限制。添加字符串文本需要重启应用程序。

CS9274 表示声明无法在数据段中发出。 为应用程序禁用此功能。 调试工具在调试时更改了数据部分中的字符串数据后发出 CS9315 ,并且必须重启应用。