StringBuilder 初始值设定项在 VS2015 中以一种方式工作,但在 VS2013 中以另一种方式工作

本文关键字:方式 工作 一种 另一种 VS2013 但在 VS2015 StringBuilder | 更新日期: 2023-09-27 18:34:40

我有以下代码行,适用于VS 2015和.Net 4.0,但是在VS 2013中出现错误。

StringBuilder s = new StringBuilder("test") {[0] = 'T'};

为什么它以不同的方式工作?

StringBuilder 初始值设定项在 VS2015 中以一种方式工作,但在 VS2013 中以另一种方式工作

基本上,对象初始值设定项表达式不支持 C# 5 中的索引(这是 VS2013 支持的(。这是 C# 6 中的一项新功能。

在 C# 6 中,代码等效于:

StringBuilder tmp = new StringBuilder(); // Compiler-generated 
tmp[0] = 'T';
StringBuilder s = tmp;

在 C# 5 中没有与此等效的单表达式......当然,您可以使用new StringBuilder("T")来实现相同的结果......

明显的用例是Dictionary<,> - 但我认为通常最好为此使用"旧样式"对象初始值设定项语法,最终调用Add

var dict = new Dictionary<string, int>
{
    { "key1", 10 },
    { "key2", 20 }
};

基于索引器的等效项是:

var dict = new Dictionary<string, int>
{
    ["key1"] = 10,
    ["key2"] = 20
};

。但这里的缺点是,如果您提供两个相等的键,第二个将愉快地覆盖第一个键,因为这是Dictionary<,>索引器的行为......而对于Add,将抛出异常。鉴于在对象初始值设定项中几乎总是希望指定不同的键,Add方法比索引器方法提供更多的 bug 保护。

但是,此功能非常有用的地方是具有索引器但没有(工作(Add方法的类型。例如,固定长度集合可能很好地支持元素替换,但不支持添加。

有关 C# 6 语言功能的更多详细信息,请参阅 Roslyn Codeplex 站点。

您正在使用 C# 6 的语言功能,称为对象初始值设定项表达式,该功能在 Visual Studio 2013 中受支持,但未使用索引器。

引用页面中的示例介绍了此新的 C# 6 功能:

var cppHelloWorldProgram = new Dictionary<int, string>
{
  [10] = "main() {",
  [20] = "    printf('"hello, world'")",
  [30] = "}"
};

这会将三个项目添加到字典中,分别具有键 10、20 和 30。