StringBuilder初始化程序在VS2015中运行一种方式,而在VS2013中运行另一种方式

时间:2014-12-18 15:48:49

标签: c# visual-studio-2013 stringbuilder vs-2015-preview

我有以下代码行,在VS 2015和.Net 4.0中有效,但我在VS 2013中收到错误。

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

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

2 个答案:

答案 0 :(得分:8)

基本上,对象初始化表达式不支持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<,> - 但我认为通常使用&#34;旧样式&更好的主意&#34} #34;对象初始值设定项语法,最终调用Add

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

基于索引器的等价物是:

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

...但这里的缺点是,如果你提供两个相等的键,第二个将很乐意覆盖第一个,因为Dictionary<,>索引器的行为......而Add 1}},将抛出异常。鉴于在对象初始化程序中,您几乎总是想要指定不同的键,Add方法可以提供比索引器方法更多的bug保护。

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

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

答案 1 :(得分:1)

您使用的是a language feature of C# 6调用的对象初始值设定表达式,Visual Studio 2013支持该表达式,但不使用索引器。

来自引用页面的示例,讲述了这个新的C#6功能:

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

这会在字典中添加三个项目,包含键10,20和30。