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)
为什么它以不同的方式工作?
基本上,对象初始化表达式不支持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站点.
| 归档时间: |
|
| 查看次数: |
209 次 |
| 最近记录: |