C# 如何防止对IReadOnlyList进行更改<;T>;?

C# 如何防止对IReadOnlyList进行更改<;T>;?,c#,readonly-collection,C#,Readonly Collection,我需要使用IReadOnlyList作为返回参数,因为它最符合我的需要,但是正如您在下面的示例中看到的,如果它不是真正的只读列表,您仍然可以修改它包装的列表 using System.Collections.Generic; using System.Collections.Immutable; public class Test { public Test() { // return an IReadOnlyList that wraps a List, we

我需要使用
IReadOnlyList
作为返回参数,因为它最符合我的需要,但是正如您在下面的示例中看到的,如果它不是真正的只读列表,您仍然可以修改它包装的列表

using System.Collections.Generic;
using System.Collections.Immutable;

public class Test
{
    public Test()
    {
        // return an IReadOnlyList that wraps a List, we can modify content
        var list1 = GetList1();
        if (list1 is List<Section> sections1) // can be true
        {
            sections1.Clear();
        }

        // return an IReadOnlyList that wraps an ImmutableArray, we cannot modify content
        var list2 = GetList2();
        if (list2 is List<Section> sections2) // never true
        {
            sections2.Clear();
        }
    }

    public static IReadOnlyList<Section> GetList1()
    {
        return new List<Section> {new Section()};
    }

    public static IReadOnlyList<Section> GetList2()
    {
        return ImmutableArray.Create(new Section());
    }
}

public struct Section
{
}
使用System.Collections.Generic;
使用System.Collections.Immutable;
公开课考试
{
公开考试()
{
//返回一个包装列表的IReadOnlyList,我们可以修改内容
var list1=GetList1();
if(list1是List sections1)//可以为true
{
第1节清除();
}
//返回包装ImmutableArray的IReadOnlyList,我们无法修改内容
var list2=GetList2();
if(list2是List sections2)//从不为真
{
第2节清除();
}
}
公共静态IReadOnlyList GetList1()
{
返回新列表{new Section()};
}
公共静态IReadOnlyList GetList2()
{
返回ImmutableArray.Create(new Section());
}
}
公共结构部分
{
}
问题:

ImmutableArray
看起来很棒,因为它确实是只读的,唯一的问题是我不想/不需要公开返回允许生成副本的更改

因此,我坚持返回
IReadOnlyList
,因为它的目的很简单,但我需要修复可能可修改的列表问题

问题:

ImmutableArray
作为
IReadOnlyList
返回是正确的方法吗


如果没有,那么您能就如何做提出建议吗?

这不是
IReadOnlyList
的工作方式

IReadOnlyList
表示一个列表,其中编号和顺序 列表元素的类型为只读列表元素的内容不可用 保证为只读

如果您想要一个
不可变的
集合
请签出

System.Collections.Immutable命名空间包含接口和 定义不可变集合的类


请记住,
IReadOnlyList
不会“包装”任何内容。它仍然是同一个列表对象<代码>列表实现了
IReadOnlyList
,这就是您访问它的方式。这就像在手机上盖上一个盖子,遮住屏幕的下半部分——它仍然是同一部手机。如果你想做的不仅仅是阻止人们意外修改列表,我想说
ImmutableArray
是正确的方法。好吧,这不是正确的术语!很抱歉,我要编辑我的问题,因为我忘了提到一些东西。如果您不公开原始列表,可以使用AsReadOnly方法,请参阅哪个方法创建了一个只包含只读集合方法的包装器。@ckuri查看中的备注部分