为什么不能为C#中自动实现的属性指定不同的访问修饰符

ckv*_*ckv 8 c#

为什么以下表达式无效?我知道如何解决错误,但想知道现在允许这个陈述背后的理由.

public int Number {public get;protected set; }
Run Code Online (Sandbox Code Playgroud)

我没有用例或应用程序来详细说明为什么应该允许这样做.但是编译器会抛出2个错误:

Error   2   The accessibility modifier of the 'LambdaExpressions.Program.Person.Number.get' accessor must be more restrictive than the property or indexer 'LambdaExpressions.Program.Person.Number'    LambdaExpressions\LambdaExpressions\Program.cs  66  39  LambdaExpressions
Run Code Online (Sandbox Code Playgroud)

Error   1   Cannot specify accessibility modifiers for both accessors of the property or indexer 'LambdaExpressions.Program.Person.Number'  LambdaExpressions\LambdaExpressions\Program.cs  66  24  LambdaExpressions
Run Code Online (Sandbox Code Playgroud)

Dam*_*ver 27

因为您必须首先指定其中一个修饰符:

public int Number {public get;protected set; }
//^
//here
Run Code Online (Sandbox Code Playgroud)

如果在两个访问器上都有修饰符,那么修改器会修改什么?

即想象一个更奇怪的例子:

public int Number {protected get;protected set; }
Run Code Online (Sandbox Code Playgroud)

究竟一部分或概念Number现在是public

来自MSDN的 Per @ dash的评论:

默认情况下,这些访问者具有相同的可见性或访问级别:它们所属的属性或索引器的可见性或访问级别

仅当属性或索引器同时具有set和get访问器时,才可以使用访问者修饰符.在这种情况下,允许在两个访问器中的一个上使用修饰符.

(我的重点)

  • + 1,但我认为值得一提的是,虽然你的例子很有意义,但原因实际上是因为规范说你只能覆盖其中一个属性的访问者 - http://msdn.microsoft.com/en-us /library/75e8y5dd.aspx (6认同)
  • 如果你不介意的话,我可以补充一下这句话,但我认为我的答案解决了规范背后的理由*. (2认同)

Tig*_*ran 5

因为向属性提供访问修饰符不仅会自动将其委托给getset,而且还意味着限制:即使应用于它们的任何修饰符必须在属性本身上定义的修饰符更具限制性.

考虑到这一点,你可以做到

public int A {
    get; 
    private set; 
}
Run Code Online (Sandbox Code Playgroud)

但你做不到(按语言设计)

    //both modifer can not have be more restrictive then property itself
    //non sence
    public int A {
        protected get; 
        private set; 
    }
Run Code Online (Sandbox Code Playgroud)

哟不能这样做

    //one of modifiers is less restrictive
    //again non sence
    protected int A {
        public get; 
        set; 
    }
Run Code Online (Sandbox Code Playgroud)