为什么内部保护不比内部更严格?

问题描述 投票:0回答:8

我想创建一个内部自动属性:

internal bool IP { get; protected internal set; }

我认为可以使设置器

protected
protected internal
- 但我总是收到错误可访问性修饰符必须比属性更具限制性。不是这样的吗?
Private
在这里对我没有帮助。

编辑:
问题是:如何实现具有内部 getter 和受保护 setter 的自动属性?

c# access-modifiers
8个回答
53
投票

实际上是

protected
internal
,而不是。同一程序集中的派生类和类型都可以访问它。认为 protected internal 意味着只能由同一程序集中的派生类访问是一种常见的误解。
    


30
投票

FamilyAndAssembly:比受保护或内部更具限制性
  • FamilyOrAssembly:比受保护或内部限制更少
  • “受保护的内部”在C#中是指FamilyOrAssembly; FamilyAndAssembly 没有修饰符。

因此,您的

protected internal

setter 比

internal
整体属性的限制要少。你能做的是:

protected internal bool IP { internal get; set; }

但是你的 setter 比 getter 受到的限制要少,这很奇怪......

另一个(有些等效)替代方案是:

internal bool IP { get; set; } protected void SetIP(bool ip) { this.IP = ip; }



7
投票

protected internal bool IP { get; protected set; }

    


5
投票

为什么我无法从派生类访问受保护的成员,第三部分

最终,他的答案与这里的海报给出的答案基本相同,但他在语言的设计和这些功能的实现背后提出了一些有趣的推理。


3
投票
protected internal

protected
internal
限制更少,因为它允许其子类 (
protected
) 和同一程序集中的任何内容 (
internal
) 访问某些内容。
    


1
投票


1
投票


0
投票
辅助功能修饰符必须比属性更具限制性

Internal 比 protected 更具限制性:因为受保护的东西可以在程序集外部看到(通过子类)。

编译器表示,当整个

set

属性是内部的(即在程序集外部不可见)时,说

IP
受保护(即对程序集外部的子类可见)是没有意义的。
    

© www.soinside.com 2019 - 2024. All rights reserved.