我可以使用大括号初始化BCL不可变集合吗?

时间:2013-06-02 11:04:24

标签: c# collections initialization immutability base-class-library

在过去,我们可以使用大括号方便地初始化可变集合,如下例所示:

var myDictionary = new Dictionary<string, decimal> {{"hello", 0m}, {"world", 1m}};

是否有类似的语法可以与BCL不可变集合一起使用?我知道它仍然是预发行版但可能有一个推荐的语法,或者至少这个问题将作为实现这些方便的初始化器的反馈。

与此同时,我发现的最短时间如下:

var myDictionary = new Dictionary<string, decimal> {{"hello", 0m}, {"world", 1m}}.ToImmutableDictionary();

1 个答案:

答案 0 :(得分:7)

  

是否有类似的语法可以与BCL不可变集合一起使用?

据我所知 - 不幸的是,对象和集合初始化器依赖于的可变性。在这方面,令人遗憾的是,语言的设计并非如此,如果有一个带有返回值的Add方法,则可以将其用作中间值。 (这对于在对象初始值设定项中设置属性没有帮助,请注意,我更喜欢名称PlusAdd以使语义更清晰。)

我认为您已经使用的方法是最适合快捷方式的方法。

对于ImmutableList,它稍微简单一些:

var list = ImmutableList.Create(1, 2, 3);

相当简单(并允许类型推断)但我不知道ImmutableDictionary的任何类似内容。有一个Create的重载需要一个IEnumerable<TKey, TValue>,但构建任何实现都可能像刚刚构建可变字典一样繁琐。