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

tan*_*ius 31 c# access-modifiers

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

internal bool IP { get; protected internal set; }
Run Code Online (Sandbox Code Playgroud)

我认为可以制作setter protectedprotected internal- 但我总是得到错误的accessibility修饰符必须比属性更具限制性.不是这样的吗?Private这里没有帮助我.

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

Meh*_*ari 50

这是有效protectedinternal.这是访问在同一装配派生类和类型.这是一种常见的误解,认为protected internal只能在同一个程序集中的派生类中访问它.

  • 你不能.Getter/setter访问修饰符应该是属性访问修饰符的适当子集. (2认同)
  • 我的问题实际上是误解了受保护的内部手段受到保护和内部 - 感谢指出这一点. (2认同)
  • @devinb:我的第一句话可能是.但是第二句澄清了这个问题:"它可以通过派生类和同一程序集中的类型访问." (2认同)

Jon*_*eet 29

在.NET级别,有两个相似但不同的访问级别:

  • FamilyAndAssembly:比受保护或内部更具限制性
  • FamilyOrAssembly:比受保护或内部限制更少

C#中的"protected internal"表示FamilyOrAssembly; FamilyAndAssembly没有修饰符.

因此,您的protected internalsetter比internal整体属性的限制更少.你能做的是:

protected internal bool IP { internal get; set; }
Run Code Online (Sandbox Code Playgroud)

但是你的二传手比你的吸气剂受限制更少,这很奇怪......

另一种(有些相同的)替代方案是:

internal bool IP { get; set; }

protected void SetIP(bool ip)
{
    this.IP = ip;
}
Run Code Online (Sandbox Code Playgroud)


Dev*_*inB 5

我会考虑这种作弊行为,因为Eric Lippert本人就是这样,但他写了一篇很好的博客文章来考虑这个问题.

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

最终,他的回答与这里的海报大致相同,但他在语言的设计和这些功能的实现背后给出了一些有趣的推理.

  • 这不是"作弊".无论如何,发布链接.它节省了我的时间. (7认同)

voi*_*oid 5

考虑到Jon Skeet提到的内容(以及user59808的评论),这不会达到预期的效果吗?

protected internal bool IP { get; protected set; }