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

8
在旧版本中,我们可以方便地使用大括号初始化可变集合,例如下面的示例:
var myDictionary = new Dictionary<string, decimal> {{"hello", 0m}, {"world", 1m}};

是否有类似的语法可以用于BCL不可变集合?我知道这仍然是一个预发布版本,但也许有一个推荐的语法,或者至少这个问题将作为反馈来实现这些方便的初始化程序。

与此同时,我找到的最短的语法如下:

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

12
据我所知,BCL不可变集合中没有类似的语法。不幸的是,对象和集合初始化程序都依赖于可变性。在这方面,如果语言设计中存在带有返回值的Add方法,则可以将其用作中间值,这样就很遗憾。 (当然,这对于对象初始化程序中设置属性没有帮助,而且我更喜欢使用名称Plus而不是Add来使语义更清晰。)我认为你已经在使用的方法是快捷方式中最合适的方法。对于ImmutableList,它稍微简单一些:
var list = ImmutableList.Create(1, 2, 3);

这个方法(并允许类型推断)相对简单,但我不知道是否有类似的方法适用于ImmutableDictionary。虽然有一个重载的Create方法可以接受一个IEnumerable<TKey, TValue>,但构造任何实现都很棘手,就像你已经在做的那样构建可变字典。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接