为什么私有字段可以访问,私有setter无法通过静态方法访问?

T M*_*own 3 c#

以下给出了编译错误:

    private ObservableEventListener Listener { get; private set; }

    public static void Register()
    {
        Log.Listener = new ObservableEventListener();
        Log.Listener.EnableEvents(Log, EventLevel.LogAlways, EventKeywords.None); 
    }
Run Code Online (Sandbox Code Playgroud)

错误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);

    }
Run Code Online (Sandbox Code Playgroud)

围绕支持setter方法似乎有更多的安全性?总是有冗余的代码/警告行.为什么这是一个错误?

Mar*_*ell 6

最终,这里唯一合理的答案是"因为语言设计者指定属性访问器上的可访问性声明必须比属性本身更具限制性".这完全是为什么它是一个错误.为什么他们选择那个...好吧,你可以尝试阅读带注释的规范,但是......嗯.

我想在一个属性有一个public修饰符是没有意义的private,所以明显不那么严格(更容易理解)是无意义的; 同样限制是多余的:你可能会添加关键字,意图做某事,而且没有结果 - 所以可能是一个错误.

  • 嘿,你甚至不需要阅读规范.编译器错误说明了它. (2认同)

dee*_*see 6

由于关于编译的问题通常都是这样,答案是因为规范是这样说的!

第10.7.2节(强调我的)

  • accessor-modifier 必须声明一个可访问性,该可访问性比声明的属性或索引器本身的可访问性更严格.确切地说:
    • 如果属性或索引器具有声明的public可访问性,则accessor-modifier可以是受保护的内部,内部,受保护或私有.
    • 如果属性或索引器具有已声明的protected internal可访问性,则accessor-modifier可以是internal,protected或private.
    • 如果属性或索引器具有已声明的internal或protected的可访问性,则accessor-modifier必须是private.
    • 如果属性或索引器具有声明的private可访问性,则不能使用accessor-modifier.

  • +1用于查找规范的相关部分.再次+1(如果可以)找到*这个确切的场景*列在规范中. (2认同)

Bra*_*NET 5

private在setter上指定的,通常都没问题,除了你也创建了这个成员private.

private没有比private违反错误中引用的规则更严格的限制,即:

'MyEventSource.Listener.set'访问器的可访问性修饰符必须比属性或索引器'MyEventSource.Listener'更具限制性

也许语言设计者应该允许相同的限制性,但他们没有,所以编译失败.