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

时间:2009-06-30 14:09:19

标签: c# access-modifiers

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

internal bool IP { get; protected internal set; }

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

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

8 个答案:

答案 0 :(得分:50)

它实际上是protectedinternal,而不是。可以通过同一程序集中的派生类和类型访问两者。认为protected internal意味着只能访问同一程序集中的派生类,这是一种常见的误解。

答案 1 :(得分:29)

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

  • FamilyAndAssembly:比受保护或内部更具限制性
  • FamilyOrAssembly:比受保护或内部的限制更少
C#中的“protected internal”意味着FamilyOrAssembly; FamilyAndAssembly没有修饰符。

因此,您的protected internal setter比internal整体属性限制性更小。你能做的是:

protected internal bool IP { internal get; set; }

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

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

internal bool IP { get; set; }

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

答案 2 :(得分:5)

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

Why Can't I Access A Protected Member From A Derived Class, Part Three

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

答案 3 :(得分:5)

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

protected internal bool IP { get; protected set; }

答案 4 :(得分:2)

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

答案 5 :(得分:1)

protected internal表示对同一程序集中的类或从包含类派生的类可见 - 换句话说,对于符合内部要求或受保护要求的人而言,它是可见的,而不是AND。没有访问修饰符意味着以这种方式保护AND内部。

答案 6 :(得分:1)

受保护的内部意味着受保护的OR内部,不受保护和内部。因此范围仅限于相同的程序集或派生类,不一定都是。

答案 7 :(得分:0)

  

辅助功能修饰符必须比属性

更具限制性

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

编译器说,当整个set属性是内部的(即在程序集外部不可见)时,IP受保护(即对程序集外的子类可见)是没有意义的。