为什么可以通过ref参数修改readonly字段?

Why can readonly fields be modified through ref parameters?

考虑:

class Foo
{
    private readonly string _value;

    public Foo()
    {
        Bar(ref _value);
    }

    private void Bar(ref string value)
    {
        value = "hello world";
    }

    public string Value
    {
        get { return _value; }
    }
}

// ...

var foo = new Foo();
Console.WriteLine(foo.Value); // "hello world"

这如何编译,仍然有效?我不应该能够在构造函数之外为 _value 字段分配不同的值,因为它被标记为 readonly。但是,通过ref传给一个方法,确实可以操作

这很危险吗?为什么?我觉得不对劲,但我不能完全确定。

它编译是因为您仅将值作为构造函数中的 ref 参数传递(允许设置 readonly 字段)。如果您将对 Bar() 的调用移至其他方法,它将失败。

class Foo
{
    private readonly string _value;

    public Foo()
    {
        Bar(ref _value);
    }

    public void Baz()
    {
        Bar(ref _value);
    }

    private void Bar(ref string value)
    {
        value = "hello world";
    }

    public string Value
    {
        get { return _value; }
    }
}

以上代码提供了一个非常明显的编译器错误:

A readonly field cannot be passed ref or out (except in a constructor)