为什么不能为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
因为您必须首先指定其中一个修饰符:
public int Number {public get;protected set; } //^ //here
如果在两个访问器上都有修饰符,修改器会修改什么?
即想象一个更奇怪的例子:
public int Number {protected get;protected set; }
究竟Number
哪个部分或概念现在public
?
Per @ dash的评论,来自MSDN :
默认情况下,这些访问者具有相同的可见性或访问级别:它们所属的属性或索引器的可见性或访问级别
仅当属性或索引器同时具有set和get访问器时,才可以使用访问者修饰符。 在这种情况下, 只允许在两个访问器中的一个上使用修饰符。
( 我的重点 )
因为向属性提供访问修饰符不仅会自动将其委托给get
和set
,还意味着一个限制 :即使应用于它们的任何修饰符必须比在属性本身上定义的修饰符更具限制性。
考虑到这一点,你可以做到
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; }
你的例子是多余的。 访问修饰符已经公开,再次指定它是没有意义的。
但是,真正的问题是C#语言只允许您指定更多限制性修饰符,因此以下代码是非法的:
private int Number {public get; set;}
如果您指定相同级别(即公共和公共),这也具有非法的副作用。 它必须更具限制性。
您也可以只指定一个修饰符,因为否则在属性本身上放置访问修饰符毫无意义。
public int Number {protected get; private set;} // How is it public?