为什么以下表达式无效?我知道如何解决错误,但想知道现在允许这个陈述背后的理由.
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访问器时,才可以使用访问者修饰符.在这种情况下,只允许在两个访问器中的一个上使用修饰符.
(我的重点)
因为向属性提供访问修饰符不仅会自动将其委托给get和set,而且还意味着限制:即使应用于它们的任何修饰符必须比在属性本身上定义的修饰符更具限制性.
考虑到这一点,你可以做到
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)