多行字符串文字格式给我错误 - 输入字符串格式不正确

时间:2015-09-04 15:56:37

标签: c#

我有以下变量:

var setting = 
$@"worker_processes     {{0}};
worker_rlimit_nofile    String.Format();
error_log               logs/{{2}} {{3}};

events
{{
    worker_connections {{4}};
    multi_accept {{5}};
}}";

当我对其执行以下return string.Format(setting, this.worker_processes, this.worker_rlimit_nofile, this.error_log_file, this.error_log_level, this.worker_connections this.multi_accept ? "on" : "off"); 操作时:

String.Format()

我收到以下错误:输入字符串的格式不正确。

有什么想法吗?

编辑 - 已修复

感谢Jon Skeet,我在没有使用return $@"worker_processes { this.worker_processes }; worker_rlimit_nofile { this.worker_rlimit_nofile }; error_log logs/{ this.error_log_file } { this.error_log_level }; events {{ worker_connections { this.worker_connections }; multi_accept { (this.multi_accept ? "on" : "off") }; }}"; 的情况下找到了这个解决方案:

people[x].birthday = people[y].birthday

2 个答案:

答案 0 :(得分:4)

目前尚不清楚究竟发生了什么,因为版本混乱,但我怀疑你只想要:

var setting = 
@"worker_processes     {0};
worker_rlimit_nofile    {1};
error_log               logs/{2} {3};

events
{{
    worker_connections {4};
    multi_accept {5};
}}";

现在events块的大括号仍将被转义,但其余的将被视为格式说明符。

以下是一个完整的例子:

using System;

class Test
{
    static void Main(string[] args)
    {
        var setting = 
@"worker_processes     {0};
worker_rlimit_nofile    {1};
error_log               logs/{2} {3};

events
{{
    worker_connections {4};
    multi_accept {5};
}}";
        string text = string.Format(setting, 10, true, "log.txt", "debug", 20, false);
        Console.WriteLine(text);
    }
}

输出:

worker_processes     10;
worker_rlimit_nofile    True;
error_log               logs/log.txt debug;

events
{
    worker_connections 20;
    multi_accept False;
}

或者使用C#6中的字符串插值:

    return $@"worker_processes     {worker_processes};
worker_rlimit_nofile    {worker_rlimit_nofile};
error_log               logs/{error_log_file} {error_log_level};

events
{{
    worker_connections {worker_connections};
    multi_accept {multi_accept};
}}";

答案 1 :(得分:2)

使用$激活字符串插值,允许字符串根据局部变量自动配置。如果您想使用数字省略和string.Format,请不要使用插值。由于插值,events are escaping to single braces, which then are seen by Format`周围的双括号作为格式说明符,但语法无效。如果你必须使用插值,再次逃避这些括号(使它们四倍)

另请注意,doble大括号会从格式说明符中删除,所以你需要除了" events"之外的所有大括号。或者他们将以{0}{1}的形式返回结果字符串中。

最后,请注意,您只有4个对象被传递到Format - 因为您的说明符达到5,您需要6个对象,否则您将遇到更多例外。