为什么要编译?分配给只读属性可以正常工作

时间:2019-10-11 20:02:53

标签: c#

我遇到了C#编译器的怪异行为。您能详细说明为什么此代码可以正常工作吗?

public class A
{
  public void Test()
  {
    var x = new B
    {
      // assigning to a read only property
      ReadOnlyProperty = {new KeyValuePair<int, int>(1, 1)}
    };           
  }
}

class B
{
  public IDictionary<int,int> ReadOnlyProperty { get; }
}

预期的行为是无法将任何内容分配给只读属性。

1 个答案:

答案 0 :(得分:3)

这不是分配,而是集合初始化程序。 ctor中的语句等效于以下代码:

var x = new B();
x.ReadOnlyProperty.Add(new KeyValuePair<int, int>(1, 1));

因此,您只是获取该属性(并操作该实例),而不进行设置。请记住,readonly不会阻止您更改对象的状态。只是您不能将其分配给ctor及其初始化程序之外的字段。