8

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

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
4

3 回答 3

28

因为您已经必须先指定一个修饰符:

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

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

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

public int Number {protected get;protected set; }

现在究竟是什么部分或概念?Numberpublic

根据 @dash 的评论,来自MSDN

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

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

我的重点

于 2013-06-24T06:58:51.850 回答
5

因为为属性提供访问修饰符不仅将其自动委托给getand 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; 
    }
于 2013-06-24T07:05:24.093 回答
0

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

然而,真正的问题是 C# 语言只允许你指定更严格的修饰符,因此下面的代码是非法的:

private int Number {public get; set;}

如果您指定相同的级别(即公共和公共),这也会产生非法的副作用。它必须更加严格。

您也可以只指定一个修饰符,因为否则在属性本身上放置访问修饰符是没有意义的。

public int Number {protected get; private set;} // How is it public?
于 2013-06-24T07:06:25.010 回答