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

时间:2013-06-24 06:55:38

标签: c#

为什么以下表达式无效? 我知道如何解决这些错误,但想知道现在允许此声明背后的理由。

public int Number {public get;protected set; }

我没有用例或应用程序来详细说明为什么应该允许这样做。但编译器会抛出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

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

3 个答案:

答案 0 :(得分:26)

因为你必须先指定一个修饰符:

public int Number {public get;protected set; }
//^
//here

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

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

public int Number {protected get;protected set; }

Number部分或概念现在是public吗?

Per {dash的评论,来自MSDN

  

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

     

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

我的重点

答案 1 :(得分:5)

因为向属性提供访问修饰符不仅会自动将其委托给getset,而且还意味着限制:即使应用了任何修饰符,要更多限制那个在属性本身上定义的那个。

考虑到这一点,你可以

public int A {
    get; 
    private set; 
}

但你不能(通过设计语言)

    //both modifer can not have be more restrictive then property itself
    //non sence
    public int A {
        protected get; 
        private set; 
    }

哟不能做

    //one of modifiers is less restrictive
    //again non sence
    protected int A {
        public get; 
        set; 
    }

答案 2 :(得分:0)

你的例子是多余的。访问修饰符已经公开,再次指定它是没有意义的。

然而,真正的问题是C#语言只允许您指定更多限制性修饰符,因此以下代码是非法的:

private int Number {public get; set;}

如果您指定相同级别(即公共和公共),这也具有非法的副作用。它必须更具限制性。

您也可以只指定一个修饰符,否则在属性本身放置访问修饰符毫无意义。

public int Number {protected get; private set;} // How is it public?