我遇到了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; }
}
预期的行为是无法将任何内容分配给只读属性。
答案 0 :(得分:3)
这不是分配,而是集合初始化程序。 ctor中的语句等效于以下代码:
var x = new B();
x.ReadOnlyProperty.Add(new KeyValuePair<int, int>(1, 1));
因此,您只是获取该属性(并操作该实例),而不进行设置。请记住,readonly
不会阻止您更改对象的状态。只是您不能将其分配给ctor及其初始化程序之外的字段。