You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为StringBuilder.AppendLine编写带指定FormatProvider的扩展方法

解决StringBuilder.AppendInvariantLine扩展方法的CS1615错误

错误原因

你遇到的CS1615错误,本质是扩展方法的参数签名和C#插值字符串的编译逻辑不匹配。当使用插值字符串调用方法时,编译器会自动生成对应参数传递逻辑,若你的方法错误使用了out参数或签名不兼容,就会触发该错误。

正确实现方案

要实现无需显式传递CultureInfo.InvariantCulture的AppendInvariantLine扩展方法,需利用C#插值字符串的IFormattable特性,同时兼容传统格式字符串调用场景,具体代码如下:

using System;
using System.Text;
using System.Globalization;

public static class StringBuilderExtensions
{
    // 适配插值字符串的重载:接受IFormattable类型参数
    public static StringBuilder AppendInvariantLine(this StringBuilder sb, IFormattable formattable)
    {
        if (sb == null) throw new ArgumentNullException(nameof(sb));
        if (formattable == null) return sb.AppendLine();
        
        // 用InvariantCulture格式化插值字符串内容
        string formattedText = formattable.ToString(null, CultureInfo.InvariantCulture);
        return sb.AppendLine(formattedText);
    }

    // 适配传统格式字符串的重载:支持格式串+参数数组
    public static StringBuilder AppendInvariantLine(this StringBuilder sb, string format, params object[] args)
    {
        if (sb == null) throw new ArgumentNullException(nameof(sb));
        if (format == null) return sb.AppendLine();
        
        string formattedText = string.Format(CultureInfo.InvariantCulture, format, args);
        return sb.AppendLine(formattedText);
    }
}

调用示例

两种调用方式都能正常工作,完全无需手动传递格式提供者:

var sb = new StringBuilder();
// 使用插值字符串调用
sb.AppendInvariantLine($"当前UTC时间: {DateTime.UtcNow:yyyy.MM.dd HH:mm:ss}");
// 使用传统格式字符串调用
sb.AppendInvariantLine("数值格式化: {0:N}", 12345.6789);

Console.WriteLine(sb.ToString());

原理说明

  • 当使用$""插值字符串时,编译器会自动将其转换为IFormattable实例,匹配第一个重载方法,内部通过IFormattable.ToString方法指定InvariantCulture完成格式化。
  • 传统格式字符串调用则直接走string.Format重载,同样注入InvariantCulture,保证格式统一。

内容的提问来源于stack exchange,提问作者user23261339

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:22:39