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

Ser*_*tin 5 c# stringbuilder visual-studio-2013 vs-2015-preview

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

StringBuilder s = new StringBuilder("test") {[0] = 'T'};
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 8

基本上,对象初始化表达式不支持C#5中的索引(这是VS2013支持的).这是C#6中的一个新功能.

在C#6中,您的代码相当于:

StringBuilder tmp = new StringBuilder(); // Compiler-generated 
tmp[0] = 'T';
StringBuilder s = tmp;
Run Code Online (Sandbox Code Playgroud)

在C#5中没有单一的表达式...当然,你可以用它new StringBuilder("T")来达到相同的效果......

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

var dict = new Dictionary<string, int>
{
    { "key1", 10 },
    { "key2", 20 }
};
Run Code Online (Sandbox Code Playgroud)

基于索引器的等价物是:

var dict = new Dictionary<string, int>
{
    ["key1"] = 10,
    ["key2"] = 20
};
Run Code Online (Sandbox Code Playgroud)

...但这里的缺点是,如果你提供两个相等的键,第二个将很乐意覆盖第一个,因为这是Dictionary<,>索引器的行为......而使用时Add,将抛出异常.鉴于在对象初始化程序中,您几乎总是希望指定不同的键,该Add方法提供了比索引器方法更多的防止错误的保护.

当这个功能是有益的,但是,对于具有一个索引,但没有(工作)类型的Add方法.例如,固定长度的集合可能很好地支持元素替换但不支持添加.

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