2013-06-24 26 views
4

为什么下面的表达式无效? 我知道如何解决错误,但想知道现在允许这种说法背后的基本原理。为什么不能在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 
+2

这只是你的语法错误,你确实可以这样做;将你的财产重新定义为'public int Number {get; protected set; }'如果你想'public' get和'protected'设置。 – dash

回答

23

因为你已经有指定修饰符第一个:

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

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

即想象一个更奇怪例如:

public int Number {protected get;protected set; } 

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

每@ Dash的意见,从MSDN

默认情况下这些访问具有相同的知名度,或访问级别:该属性或索引的它们所属

您可以使用访问修饰符只有属性或索引器同时设置并获取访问器时。在这种情况下,在两个访问器中只有一个允许修改器

我强调

+6

+ 1,但我认为值得一提的是,虽然你的例子有道理,但其原因实际上是因为规范说你只能覆盖其中一个属性的访问者 - http://msdn.microsoft.com/en- us/library/75e8y5dd.aspx – dash

+2

如果您不介意,我可能会添加该引用,但我认为我的回答是针对规范背后的基本原理。 –

4

因为对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; 
    } 
0

你的例子是多余的。访问修饰符已经公开,指定它是毫无意义的。

然而,真正的问题是,C#语言只允许你指定限制性更强的调节剂,因此下面的代码是非法的:

private int Number {public get; set;} 

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

您也可以只指定一个修饰符,因为否则就无法在属性本身上放置访问修饰符。

public int Number {protected get; private set;} // How is it public? 
相关问题