C# 只读属性设置器

C# 只读属性设置器,c#,properties,C#,Properties,经过广泛的调试会话后,我发现问题在于我调用了只读属性的setter。发生这种情况时,是否有技巧引发编译器警告?因为将setter标记为private不起作用 干杯 CA 为了明确我的意思: private readonly List<SomeObject> _budget; public IEnumerable<SomeObject> Budget { get { return _budge

经过广泛的调试会话后,我发现问题在于我调用了只读属性的setter。发生这种情况时,是否有技巧引发编译器警告?因为将setter标记为private不起作用

干杯

CA


为了明确我的意思:

    private readonly List<SomeObject> _budget;
    public IEnumerable<SomeObject> Budget
    {
        get
        {
            return _budget;
        }
    }

如果没有编译器{error,warning,message}

请删除setter。

如果属性有setter,则它不是只读的。删除setter使其成为只读

public string MyProperty // not read-only
{
    get { return myPropertyBacking; }
    set { myPropertyBacking = value; }
}

public string MyProperty // read-only
{
    get { return myPropertyBacking; }
}

你搞混了。在您的示例中,如果您尝试执行
A.Budget=newsomeobject(),编译器将产生错误如果类
A
中的属性
Budget
没有设置器。 从现在起,我只能假设你的问题是什么

我猜您希望包装在
Budget
属性中的集合是只读的。这可能就是为什么您将其设置为
IEnumerable
,而私有成员是
列表
。因此,即使您没有setter,您仍然可以执行
(a.Budget as List)。添加(bla)
。要禁止此操作,您可以这样使用:

private readonly List<SomeObject> _budget;
public ReadOnlyCollection<SomeObject> Budget
{
    get
    {
        return _budget.AsReadOnly();
    }
}
private readonly List\u预算;
公共只读集合预算
{
得到
{
返回_budget.AsReadOnly();
}
}

就其本身而言,这是没有意义的,但如果您的示例是这样的话

private readonly List<SomeObject> _budget;
public List<SomeObject> Budget
{
    get
    {
        return _budget;
    }
}
这样做不会出错

编辑
bitbonk的最新编辑正是我要做的!我只是在等待问题的确认。

在什么情况下?100%确定,如果您从类外的代码调用私有setter,它将永远不会编译。我是不是遗漏了什么?我不知道这怎么可能不出错。看起来您需要
A.Budget=newlist()
但即使如此,它仍应给出一个错误,说明“无法将属性或索引器'Budget'分配给--它是只读的”@drs9222:Agreed<代码>A.预算
在列出的代码中不可分配。哎呀,你说得对。之前应该检查过第三次posting@AnonymousCoward这是否意味着您确实会出错?我知道你已经得到了答案,但我很好奇到底发生了什么。
private readonly List<SomeObject> _budget;
public List<SomeObject> Budget
{
    get
    {
        return _budget;
    }
}
A.Budget.Add(new SomeObject());