c# - StringBuilder 初始化程序在 VS2015 中以一种方式工作,但在 VS2013 中以另一种方式工作

标签 c# visual-studio-2013 stringbuilder visual-studio-2015

我有以下代码行,适用于 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/

相关文章:

c# - 如何在 asp.net core 中更改根路径 ~/in Razor

c# - 事件处理程序未添加到新邮件项目

c# - 实体管理器 : 3 Tier/Layer Application Question

delphi - 我何时以及为什么应该使用 TStringBuilder?

c# - 为什么在 C# 中字符串连接不自动转换为 StringBuilder?

c# - RabbitMQ 消费者恢复

xml - 为 F# 记录值生成的 IntelliSense XML 不正确 (VS2013)

c# - VS2013无法加载Windows 8应用程序的资源文件

breeze - Breeze 何时支持 Entity Framework 6?

.net - StringBuilder 或 +=