如何创建包含指定值的IReadOnlyList<string>?
创建带初始值的IReadOnlyList的正确方法
嘿,我明白你遇到的困扰了——直接给IReadOnlyList<string>加元素不行,用ReadOnlyCollection的方式也没达到预期对吧?别担心,这里有几种靠谱的方法能帮你创建包含初始值的只读列表:
方法1:用List的AsReadOnly()包装
这是最常用的方式,先创建一个带初始值的List<string>,再把它转换成只读包装:
// 先构建包含初始值的可变列表 var mutableList = new List<string> { "Dog", "Cat", "Bird" }; // 转换为IReadOnlyList<string> IReadOnlyList<string> readOnlyList = mutableList.AsReadOnly();
⚠️ 注意:这种方式的只读列表是原列表的包装,如果后续修改了mutableList,readOnlyList的内容也会跟着变。如果你需要完全不可变的集合,看下面的方法。
方法2:使用ImmutableArray(完全不可变)
如果你想要一个一旦创建就不能被修改的集合,ImmutableArray是最佳选择,它天然实现了IReadOnlyList<T>:
// 直接创建带初始值的不可变数组 IReadOnlyList<string> readOnlyList = ImmutableArray.Create("Red", "Green", "Blue");
这种方式下,集合的内容完全固定,不管是外部还是内部都没法修改,非常适合需要稳定数据的场景。
方法3:直接用数组
数组本身就实现了IReadOnlyList<T>,所以你可以直接声明一个数组并赋值:
// 数组天然支持IReadOnlyList<string> IReadOnlyList<string> readOnlyList = new string[] { "Monday", "Tuesday", "Wednesday" };
虽然数组可以通过索引修改元素,但当你把它当作IReadOnlyList<string>暴露时,调用方没法调用添加/删除等修改集合结构的方法。对于字符串这种不可变类型来说,这已经足够安全了。
为什么你之前的尝试没成功?
- 直接给
IReadOnlyList<string>加元素:因为IReadOnlyList接口只定义了只读访问的方法/属性(比如Count、索引器),根本没有Add方法,所以自然没法直接添加。 - 用
ReadOnlyCollection但无效:大概率是你没先创建一个包含初始值的可变集合就直接用了——ReadOnlyCollection需要包装一个已有的集合,不能凭空创建带初始值的实例。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

