经过大量的调试会话后,我发现问题在于我调用了readonly属性的setter。发生这种情况时是否有引发编译器警告的技巧?因为将setter私有标记不起作用。
干杯,
CA
明确我的意思:
private readonly List<SomeObject> _budget;
public IEnumerable<SomeObject> Budget
{
get
{
return _budget;
}
}
可以使用
访问A.Budget=new SomeObject();
没有编译器{错误,警告,消息}
答案 0 :(得分:8)
如果您的财产有一个二传手,那么它不是只读的。删除setter使其成为只读。
public string MyProperty // not read-only
{
get { return myPropertyBacking; }
set { myPropertyBacking = value; }
}
public string MyProperty // read-only
{
get { return myPropertyBacking; }
}
答案 1 :(得分:8)
你在这里混淆了什么。在您的示例中,如果您尝试A.Budget=new SomeObject();
,如果类Budget
中的属性A
没有setter,则编译器将产生错误。
从这里开始,我只能假设你的问题是什么。
我的猜测是,您希望包含在Budget
属性中的集合是只读的。这可能是你成为IEnumerable<SomeObject>
的原因,而私人成员是List<SomeObject>
。因此,即使你没有设置器,你仍然可以(A.Budget as List<SomeObject>).Add(bla)
。要禁止此操作,您可以使用List.AsReadOnly,如下所示:
private readonly List<SomeObject> _budget;
public ReadOnlyCollection<SomeObject> Budget
{
get
{
return _budget.AsReadOnly();
}
}
答案 2 :(得分:3)
删除二传手。
答案 3 :(得分:0)
因为它没有意义,但如果你的例子意味着这样的东西......
private readonly List<SomeObject> _budget;
public List<SomeObject> Budget
{
get
{
return _budget;
}
}
可以使用
访问A.Budget.Add(new SomeObject());
这样可以正常工作。