为什么不能在C#中为自动实现的属性指定不同的访问修饰符为什么下面的表达式是无效的?我知道如何修复错误,但现在想知道允许此声明背后的基本原理。publicintNumber{publicget;保护集;我没有用例或应用程序来详细说明为什么应该允许这样做。但是编译器会抛出2个错误:Error2Theaccessibilitymodifierofthe'LambdaExpressions.Program.Person.Number.get'accessormustbemorerestrictivethanthepropertyorindexer'LambdaExpressions.Program.Person.Number'LambdaExpressionsLambdaExpressionsProgram.cs6639LambdaExpressions和错误1??无法为属性或索引器“LambdaExpressions.Program.Person.Number”的两个访问器指定可访问性修饰符LambdaExpressionsLambdaExpressionsProgram.cs6624LambdaExpressions因为您必须首先指定其中一个修饰符:publicintgetNumber;{公共保护集;}//^//这里如果两个访问器上都有修饰符,修饰符修饰了什么?也就是说,想象一个更奇怪的例子:publicintNumber{protectedget;protectedset;Number的哪一部分或概念现在是公开的?根据@dash的评论,来自MSDN:默认情况下,这些访问器具有相同的可见性或访问级别:仅当属性或索引器具有设置和获取访问权限时,它们所属的属性或索引器的可见性或访问级别访问器修饰符可以仅在指定访问器时使用。在这种情况下,修饰符只允许在两个访问器之一上使用。(我强调的)因为给一个属性提供一个访问修饰符不仅自动委托它获取和设置,它还暗含了一个限制:即使是任何应用于它们的修饰符都必须比那些定义在属性本身上的修饰符更具限制性。考虑到这一点,您可以执行publicintA{get;私有集;}但你不能(通过语言设计)//both修饰符不能比属性本身更具限制性//nonsencepublicintA{protectedget;私有集;}你不能这样做//其中一个修饰符限制较少//再次非senceprotectedintA{publicget;放;你的例子是多余的。访问修饰符已经是公共的,再次指定它没有意义。然而,真正的问题是C#语言只允许你指定更严格的修饰符,所以下面的代码是非法的:privateintNumber{publicget;set;}如果你指定了相同的级别(即public和public),这也有非法的副作用。它必须更严格。您也可以只指定一个修饰符,否则就没有必要在属性本身上放置访问修饰符。以上是C#学习教程:C#中自动实现的属性为什么不能指定不同的访问修饰符。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——publicintNumber{protectedget;privateset;}//它是如何公开的?本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
