以下给出了编译错误:
private ObservableEventListener Listener { get; private set; }
public static void Register()
{
Log.Listener = new ObservableEventListener();
Log.Listener.EnableEvents(Log, EventLevel.LogAlways, EventKeywords.None);
}
错误26' MyEventSource.Listener.set'的可访问性修饰符访问者必须比财产或索引者更具限制性' MyEventSource.Listener'
但是编译得很好:
private ObservableEventListener Listener;
public static void Register()
{
Log.Listener = new ObservableEventListener();
Log.Listener.EnableEvents(Log, EventLevel.LogAlways, EventKeywords.None);
}
支持setter方法似乎有更多的安全性?总是有冗余的代码/警告行。为什么这是一个错误?
答案 0 :(得分:6)
最终,这里唯一明智的答案是"因为语言设计者指定属性访问器上的可访问性声明必须比属性本身更具限制性"。这完全是为什么它是一个错误。为什么他们选择那个...好吧,你可以尝试阅读带注释的规范,但是...... meh。
我想这只是无意义在public
属性上设置private
修饰符,所以显然限制性较小(更易于访问)是荒谬的;同样限制是多余的:你想要添加一些关键词,并且没有结果 - 所以可能是一个错误。
答案 1 :(得分:6)
由于编译问题通常都是这样,答案是因为spec这样说了!
第10.7.2节(强调我的)
- accessor-modifier 必须声明一个可访问性,该可访问性严格比属性或索引器本身的声明可访问性更具限制性。确切地说:
- 如果属性或索引器具有声明的public可访问性,则accessor-modifier可以是内部保护的, 内部的,受保护的或私人的。
- 如果属性或索引器具有已声明的protected internal可访问性,则accessor-modifier可以是internal, 受保护的或私人的。
- 如果属性或索引器具有已声明的internal或protected可访问性,则accessor-modifier必须是私有的。
- 如果属性或索引器具有声明的private可访问性,则不能使用accessor-modifier。
答案 2 :(得分:5)
你在setter上指定了private
,这通常没问题,除了你也成了private
成员。
private
并不比private
更严格,后者违反了错误中引用的规则,即:
'MyEventSource.Listener.set'的辅助功能修饰符 访问者必须比财产或索引器更具限制性 'MyEventSource.Listener'
也许语言设计者应该允许相同的限制性,但他们没有,所以编译失败。
答案 3 :(得分:2)
在getter或setter上放置访问修饰符旨在允许您进一步限制它,而不是声明整体的原则。因此,获取私有财产然后尝试将其设置者设为私有是没有意义的,因为它已经是私有的。
正确使用,公共吸气者,私人制定者:
public ObservableEventListener Listener { get; private set; }
^^ What you want BOTH Get/Setter to be ^^ but you can make one more restrictive
错:
private ObservableEventListener Listener { get; private set; }
^^ You want BOTH Get/Setter private ^^ So what does this mean if you already made them private?