【问题标题】: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 internal 比 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”。