我有以下代码行,适用于 VS 2015 和 .Net 4.0,但我在 VS 2013 中遇到错误。
StringBuilder s = new StringBuilder("test") {[0] = 'T'};
为什么它以不同的方式工作?
最佳答案
基本上,对象初始化器表达式不支持 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
方法比索引器方法提供更多的错误保护。
然而,此功能将有用的地方是具有索引器但没有(工作)Add
的类型。方法。例如,固定长度的集合可能很好地支持元素替换但不支持添加。
有关 C# 6 语言功能的更多详细信息,请参阅 Roslyn Codeplex site .
关于c# - StringBuilder 初始化程序在 VS2015 中以一种方式工作,但在 VS2013 中以另一种方式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27550504/