2010-07-20 38 views
8

我对属性访问器有点混淆。错误:设置访问器的辅助功能修改器必须比属性或索引器更具限制性

我想有一个内部属性,它的set访问器只能被派生类访问。当我这样做

像这样

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

这个编译器会抱怨。

MSDN,讨论这个特定的错误时建议改变set访问修饰符来private

这不是我想要这个去。

它看起来像Protected Internal应该在这里使用这条修改器的选项给出了同样的错误

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

感谢

回答

10

既不protected也不protected internalinternal更多的限制。两者都会让来自不同程序集的派生类型访问setter,但不能访问getter。 protected internal给出访问联合protectedinternal,而不是交叉。 (有一个访问级别代表CLR中的交叉点,但它没有被C#公开)

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

0

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

+0

这不完全正确。在程序集中定义的公共类可以从内部类派生。公共类可以在另一个程序集中派生。然后这会使装配员在装配体之外可访问。 – 2010-07-20 17:41:12

2

内部限制比受保护的限制更多。内部使得该成员仅限于当前的程序集,而受保护的程序可以在程序集之外的任意大量的后代中访问。

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

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

+1

考虑到像ILMERGE(http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx)这样的工具以及人们使用这种工具的方式,内部“保护”的价值更低。对保护与内部的'信任'+1。 – 2010-07-21 11:05:13

相关问题