【问题标题】:Access modifiers on properties; why doesn't the following work?属性的访问修饰符;为什么以下不起作用?
【发布时间】:2011-05-25 18:12:07
【问题描述】:

我遇到了一个对我来说不太有意义的编译器错误。我有一个internal 属性,我想限制它的set 块,使其只能通过继承获得。我认为这会起作用:

internal bool MyProperty {
    get { return someValue; }
    protected internal set { someValue = value; }
}

但是编译器说set 块上的访问修饰符需要比internal 更具限制性 - 我是否遗漏了什么,或者protected internal 比@987654327 更严格@?

【问题讨论】:

    标签: c# properties access-modifiers


    【解决方案1】:

    这里,protected internalinternal 限制更少。

    • protected internal - public 用于当前程序集和在其他程序集中继承此类型的任何类型。

    • internal - 此程序集为公共,其他程序集为私有

    【讨论】:

      【解决方案2】:

      protected internal 的限制较少;它是受保护的内部(不是) - 因此另外允许来自其他程序集的子类访问它。您需要反转:

      protected internal bool MyProperty {
          get { return someValue; }
          internal set { someValue = value; }
      }
      

      这将允许您的程序集中的代码,以及来自其他程序集的子类,获取它(读取) - 但只有您的程序集中的代码可以设置它(写入)。

      【讨论】:

      • 很好的解释;现在对我来说很有意义。
      【解决方案3】:

      来自documentation C# 中的访问修饰符:

      受保护的内部可访问性 级别意味着受保护或内部,而不是 受保护的和内部的。 在其他 换句话说,受保护的内部成员可以 可以从同一类中的任何类访问 程序集,包括派生类。 将可访问性限制为仅派生的 同一个程序集中的类,声明 类本身内部,并声明 其成员受保护。


      为了达到预期的效果,您需要交换访问修饰符,如下所示:

      protected internal bool MyProperty
      {
          get { return someValue; }
          internal set { someValue = value; }
      }
      

      【讨论】:

        【解决方案4】:

        不,这是两者的结合,而不是交集;因此protected internal 比这两个单独的限制要少。交集不是 C# 的特性; CLR 确实支持“Family AND Assembly”,但 C# 仅支持“Family OR Assembly”。

        【讨论】:

          猜你喜欢
          • 2011-04-12
          • 2012-06-28
          • 2013-03-09
          • 1970-01-01
          • 2013-03-13
          • 1970-01-01
          • 1970-01-01
          • 2014-09-14
          相关资源
          最近更新 更多