【问题标题】:ERROR: the accessibility modifier of the set accessor must be more restrictive than the property or indexer错误:设置访问器的可访问性修饰符必须比属性或索引器更具限制性
【发布时间】:2010-07-20 17:24:49
【问题描述】:

我对属性访问器有点困惑。

我想要一个内部属性,它的 set 访问器只能由派生类访问。

类似的东西

internal [internalClass] MyProperty
{
get {return _prop;}
protected set {_prop = value;}
}

当我这样做时,编译器会抱怨。

MSDN,在讨论此特定错误时建议将 set 访问修饰符更改为 private

这不是我想要的。

看起来Protected Internal 应该是这里的一个选项,但是使用此修饰符会产生相同的错误

我感觉我缺少对访问修饰符的一些基本了解。

谢谢

【问题讨论】:

    标签: c#


    【解决方案1】:

    protectedprotected internal 都不比 internal 更严格。两者都会让来自不同程序集的派生类型访问 setter 而不是 getter。 protected internal 允许访问protectedinternal联合,而不是交集。 (CLR中有一个表示交集的访问级别,但C#没有公开。)

    如果符合您想要实现的目标,您最好使用私有 setter 和仅调用私有 setter 的受保护的 SetMyProperty 方法。

    【讨论】:

      【解决方案2】:

      内部比受保护更严格。 Internal 使成员仅限于当前程序集,而受保护的成员可以由程序集之外的任意大量后代访问。

      如果您打算让程序集之外的类或后代可以访问此属性,则需要丢失该属性的内部属性。如果您打算仅在您的程序集中使用此属性,则将属性访问器设置为内部。

      不幸的是,这意味着您必须放弃对内部属性访问器的保护。这很令人恼火,因为即使该属性仅限于您的程序集中的客户,但这并不意味着您真的相信所有这些客户都能正确使用您的属性。当您是唯一一个在程序集源代码中运行的作者时,这是有道理的,但是当有数百名开发人员在一个大型程序集的源代码中运行时,我更愿意在内部类上保留受保护的语义。

      【讨论】:

      【解决方案3】:

      无论出于何种原因,编译器似乎都认为允许内部类在其他程序集中具有派生类。然后,受保护的字段通过派生类被认为可用于其他程序集(即,该字段本身没有其类的访问修饰符的概念)。编译器错误表明(即使您知道它永远不会发生)指示的字段过度扩展其访问权限。

      【讨论】:

      • 这并不完全正确。程序集中定义的公共类可以派生自内部类。然后可以从另一个程序集中派生公共类。这将使设置器可以在程序集之外访问。
      猜你喜欢
      • 1970-01-01
      • 2014-04-09
      • 2014-03-06
      • 2013-03-09
      • 2012-11-22
      • 2017-09-03
      • 2019-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多