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

本文关键字:不可变 集合 BCL 初始化 可以使 | 更新日期: 2023-09-27 18:16:40

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

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

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

同时,我找到的最短的是:

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

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

是否有类似的语法可以用于BCL不可变集合?

据我所知没有——不幸的是,对象和集合初始化式都依赖于的可变性。在这方面,很遗憾语言没有设计成这样,如果有一个带有返回值的Add方法,它可以用作中间值。(注意,这对在对象初始化器中设置属性没有帮助,我更喜欢Plus而不是Add,以使语义更清晰。)

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

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

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

相当简单(并允许类型推断),但我不知道ImmutableDictionary有类似的东西。有一个Create的重载,它接受一个IEnumerable<TKey, TValue>,但是构造任何实现都可能像你已经做的那样,像构造可变字典一样繁琐。