错误:set访问器的可访问性修饰符必须比属性或索引器更具限制性

我对财产访问者有点困惑。

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

这样的事情

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

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

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

这不是我想要的地方。

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

我有一种感觉,我缺少对访问修饰符的一些基本理解。

谢谢

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

您可能最好使用私有setter和受保护的SetMyProperty方法,该方法只调用私有setter,如果它与您想要实现的匹配。

内部比受保护更具限制性。 内部使成员仅限于当前程序集,而受保护可供程序集外部的任意大量后代访问。

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

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

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