C# 为什么不能为C中自动实现的属性指定不同的访问修饰符#

C# 为什么不能为C中自动实现的属性指定不同的访问修饰符#,c#,C#,为什么下面的表达式无效我知道如何解决这些错误,但不知道现在允许这种说法的理由。 public int Number {public get;protected set; } 我没有一个用例或应用程序来详细说明为什么应该允许这样做。但编译器会抛出两个错误: Error 2 The accessibility modifier of the 'LambdaExpressions.Program.Person.Number.get' accessor must be more restric

为什么下面的表达式无效我知道如何解决这些错误,但不知道现在允许这种说法的理由。

public int Number {public get;protected set; }
我没有一个用例或应用程序来详细说明为什么应该允许这样做。但编译器会抛出两个错误:

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


因为您已经必须首先指定一个修改器:

public int Number {public get;protected set; }
//^
//here
如果两个访问器上都有修饰符,该修饰符将修改什么

也就是说,想象一个更奇怪的例子:

public int Number {protected get;protected set; }
确切地说,
Number
的哪个部分或概念现在是
public

根据@dash的评论,来自:

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

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


My emphasis

,因为为属性提供访问修饰符不仅会自动将其委托给
get
set
,而且还意味着一个限制:即使应用于它们的任何修饰符必须比在属性本身上定义的修饰符更具限制性

考虑到这一点,你可以

但你做不到(通过语言的设计)

你做不到

    //one of modifiers is less restrictive
    //again non sence
    protected int A {
        public get; 
        set; 
    }

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

然而,真正的问题是C语言只允许您指定限制性更强的修饰符,因此以下代码是非法的:

private int Number {public get; set;}
如果您指定相同的级别(即public和public),这也会产生非法的副作用。它必须更加严格

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

public int Number {protected get; private set;} // How is it public?

这只是语法上的一个错误,你确实可以这样做;如果希望
public
get和
protected
set.+1,请将属性重新定义为
public int Number{get;protected set;}
,但我认为值得一提的是,尽管您的示例很有意义,原因实际上是因为规范中说您只能覆盖其中一个属性上的访问器——如果您不介意的话,我可能会加上这句话,但我认为我的回答说明了规范背后的基本原理。
    //one of modifiers is less restrictive
    //again non sence
    protected int A {
        public get; 
        set; 
    }
private int Number {public get; set;}
public int Number {protected get; private set;} // How is it public?