我有以下变量:
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
答案 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个对象,否则您将遇到更多例外。