我有以下代码行,在VS 2015和.Net 4.0中有效,但我在VS 2013中收到错误。
StringBuilder s = new StringBuilder("test") {[0] = 'T'};
为什么它以不同的方式运作?
答案 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。