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

最初に修飾子の 1 つを指定する必要があるためです。

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

両方のアクセサーに修飾子がある場合、その修飾子は何を変更しますか?

つまり、さらに奇妙な例を想像してください。

public int Number {protected get;protected set; }

nowの正確部分または概念は何ですか?Numberpublic

MSDNからの @dash のコメントによると:

既定では、これらのアクセサーは同じ可視性またはアクセス レベル (それらが属するプロパティまたはインデクサーと同じ) を持っています。

プロパティまたはインデクサーに set アクセサーと get アクセサーの両方がある場合にのみ、アクセサー修飾子を使用できます。この場合、修飾子は2 つのアクセサーのうちの 1 つのみで許可されます。

(私の強調)

于 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 と public) を指定すると違法になるという副作用もあります。より制限する必要があります。

また、プロパティ自体にアクセス修飾子を配置しても意味がないため、修飾子を 1 つだけ指定することもできます。

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