【问题标题】:Why is internal protected not more restrictive than internal?为什么内部保护不比内部更严格?
【发布时间】:2010-11-07 00:38:23
【问题描述】:

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

internal bool IP { get; protected internal set; }

我认为可以将设置器设为protectedprotected internal - 但我总是收到错误可访问性修饰符必须比属性更具限制性。不是这样吗? Private 对我没有帮助,在这里。

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

【问题讨论】:

  • 您的错误在于将修饰符视为增加限制。修饰符实际上总是减少限制。请记住,默认情况下,事情是“私人的”;只有添加修饰符才能减少它们的限制。
  • +1 - eric lippert,你总是把它放在最好的地方
  • 其实修饰符的组合减少限制。只有设置一个修饰符确实增加public bool IP{get; private set;}等限制

标签: c# access-modifiers


【解决方案1】:

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

【讨论】:

  • 好的,如何使 getter 内部化并保护 setter?
  • 你不能。 getter/setter 访问修饰符应该是属性访问修饰符的适当子集。
  • 我的问题实际上是误解,即受保护的内部意味着受保护和内部 - 感谢您指出这一点。
  • @devinb:我的第一句话可能是。但是第二句话澄清了这个问题:“它可以被派生类和同一个程序集中的类型访问。”
  • 是的,你是对的。我的意思只是对你的第一句话的批评。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      受保护的内部意味着受保护的或内部的,而不是受保护的和内部的。所以范围仅限于相同的程序集或派生类,不一定两者兼而有之。

      【讨论】:

        【解决方案5】:

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

        • FamilyAndAssembly:比受保护或内部更严格
        • FamilyOrAssembly:比受保护或内部限制更少

        C#中的“protected internal”是指FamilyOrAssembly; FamilyAndAssembly 没有修饰符。

        因此,您的 protected internal 设置器比 internal 整体属性的限制更少。你可以做的是:

        protected internal bool IP { internal get; set; }
        

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

        另一个(有点等价的)替代方案是:

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

        【讨论】:

        • 好的,我的解决方案可能是带有受保护支持字段的内部只读属性。
        • 或者您使用私人二传手的等效替代方案也可以完成这项工作。
        • 我突然想到,(当然是几个月后)setter 仍然可以“内部”访问,这在某些方面比受保护的限制更少。要完全使其成为内部 getter 和受保护的 setter,您必须拥有 protected void SetIP(bool value) 和 internal bool GetIP(),然后拥有一个私有 bool _IP
        • 那么您刚才是不是说 CLR 的整个访问限制级别为 FamilyAndAssembly,如果不借助 IL 魔法等,在 C# 中是无法使用的?
        • @ChrisMarisic:我不知道如果你尝试使用它会发生什么。这可能就像一些被禁止的泛型约束 - C# 编译器会服从它,但不会提供任何方式在您自己的代码中表达它。
        【解决方案6】:

        可访问性修饰符必须比属性更严格

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

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

        【讨论】:

          【解决方案7】:

          我会考虑这种作弊,因为 Eric Lippert 本人也在 SO 上,但他写了一篇出色的博客文章来考虑这个问题。

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

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

          【讨论】:

          • 这不是“作弊”。无论如何,发布链接。它节省了我的时间。
          【解决方案8】:

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

          protected internal bool IP { get; protected set; }

          【讨论】:

          • 虽然选择的答案更明确,但我希望包含这个答案,作为替代方法。
          猜你喜欢
          • 2013-07-25
          • 1970-01-01
          • 1970-01-01
          • 2020-08-16
          • 1970-01-01
          • 2012-03-27
          • 2011-01-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多