C#字符串占位符与值数量不一致,运行时会抛出 `FormatException`(提示"输入字符串的格式不正确")或 `IndexOutOfRangeException`,这是由占位符索引和参数个数不匹配导致的。
常见错误
-
占位符多于参数:格式字符串有 `{0}`、`{1}` 但只传了 1 个参数,运行时找不到对应值。
-
占位符索引不连续或跳号:如 `{0} {2}` 传 3 个参数,`{2}` 本身合法,但若索引超过参数总数上限就会报错。
-
参数多于占位符:不会报错,但多余参数被忽略,容易造成"看似正常实则结果不符合预期"。
-
花括号未转义:格式字符串中直接写 `{` 或 `}`(如 JSON 片段 `"{name:\"{0}\"}"`),会被误解析为占位符边界,导致格式错误。
检查与修复方法
-
核对占位符索引:`{0}` 从 0 开始连续递增,不能跳号、重复或超过参数个数减 1。
-
核对参数数量:确保参数个数 ≥ 最大占位符索引 + 1。
-
转义花括号:需要原样输出 `{` 或 `}` 时,写成 `{{` 或 `}}`。
-
用字符串插值替代:C#6.0+ 推荐使用 `$"{name}"`,直接在字符串中写变量名,从根本上避免占位符序号和参数个数不匹配的问题。
> 插值字符串在表达式内部不需要转义花括号,但若要在结果中输出花括号本身,仍要写成 `{{` 和 `}}`。
排查定位建议
若项目较大,可先在调试器里逐个检查所有 `string.Format`、`Console.WriteLine` 等调用点,或利用异常堆栈定位到具体代码行。 如果格式化内容包含大量花括号(如 JSON),建议直接用 `System.Text.Json` 等序列化库,而不是手动拼接字符串。