为什么以下表达式无效? 我知道如何解决这些错误,但想知道现在允许此声明背后的理由。
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
答案 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)
因为向属性提供访问修饰符不仅会自动将其委托给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;
}
答案 2 :(得分:0)
你的例子是多余的。访问修饰符已经公开,再次指定它是没有意义的。
然而,真正的问题是C#语言只允许您指定更多限制性修饰符,因此以下代码是非法的:
private int Number {public get; set;}
如果您指定相同级别(即公共和公共),这也具有非法的副作用。它必须更具限制性。
您也可以只指定一个修饰符,否则在属性本身放置访问修饰符毫无意义。
public int Number {protected get; private set;} // How is it public?