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

时间:2010-07-20 17:24:49

标签: c#

我对属性访问者有点混淆。

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

类似这样的事情

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

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

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

这不是我想要的地方。

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

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

感谢

3 个答案:

答案 0 :(得分:10)

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

你可能最好使用一个私有的setter和一个受保护的SetMyProperty方法,它只调用私有的setter,如果它符合你想要达到的目的。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

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