为什么在C#7.2中具有"in"参数修饰符时仍然可以修改List <>

Cas*_*ien 1 c# c#-7.2

本周早些时候,C#7.2发布了"in"参数修饰符的新功能,请参阅此处的发行说明

发行说明中提供的详细信息包括:"参数的修饰符,用于指定参数通过引用传递但不被调用方法修改."

关于这个新功能还没有很多文档,所以我一直在尝试.似乎对原始类型按预期工作,并阻止访问对象属性.但是,对于列表,您仍然可以调用方法来修改List(即添加,删除,反向),您可以直接修改元素.

    static void Main(string[] args)
    {
        var test = new List<int>();
        test.Add(5);
        Console.WriteLine(test[0]);
        TestMethod(test);
        Console.WriteLine(test[0]);
    }

    public static void TestMethod(in List<int> myList)
    {
        myList[0] = 10;
        myList.Add(7);
        myList.Remove(2);
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么在使用"in"参数修饰符时仍然可以修改集合?

Dan*_*ite 8

in修饰符只限制分配给参考,但List<T>仍然是可以访问和可变的.基本上它的工作原理就像ref readonly.

你做不到myList = new List<int>.