我想创建一个内部自动属性:
internal bool IP { get; protected internal set; }
我认为可以设置setter protected
或protected internal
- 但我总是得到错误辅助功能修饰符必须比属性更具限制性。不是这样的吗? Private
在这里没有帮助我。
修改
问题是:如何使用内部getter和受保护的setter实现自动属性?
答案 0 :(得分:50)
它实际上是protected
或internal
,而不是和。可以通过同一程序集中的派生类和类型访问两者。认为protected internal
意味着只能访问同一程序集中的派生类,这是一种常见的误解。
答案 1 :(得分:29)
在.NET级别,有两个相似但不同的访问级别:
因此,您的protected internal
setter比internal
整体属性限制性更小。你能做的是:
protected internal bool IP { internal get; set; }
但是你的二传手比你的吸气剂受限制更少,这很奇怪......
另一种(有些相同的)替代方案是:
internal bool IP { get; set; }
protected void SetIP(bool ip)
{
this.IP = ip;
}
答案 2 :(得分:5)
我会考虑这种作弊行为,因为Eric Lippert本人就是这样,但他写了一篇很好的博客文章来考虑这个问题。
Why Can't I Access A Protected Member From A Derived Class, Part Three
最终,他的回答与这里的海报大致相同,但他在语言的设计和这些功能的实现背后给出了一些有趣的推理。
答案 3 :(得分:5)
考虑到Jon Skeet提到的内容(以及user59808的评论),这不会达到预期的效果吗?
protected internal bool IP { get; protected set; }
答案 4 :(得分:2)
protected internal
比protected
或internal
限制性更小,因为它允许其子类(protected
)和同一个程序集中的任何内容(internal
)访问某事。
答案 5 :(得分:1)
protected internal表示对同一程序集中的类或从包含类派生的类可见 - 换句话说,对于符合内部要求或受保护要求的人而言,它是可见的,而不是AND。没有访问修饰符意味着以这种方式保护AND内部。
答案 6 :(得分:1)
受保护的内部意味着受保护的OR内部,不受保护和内部。因此范围仅限于相同的程序集或派生类,不一定都是。
答案 7 :(得分:0)
辅助功能修饰符必须比属性
更具限制性
内部受保护更具限制性:因为受保护的东西可以在程序集外看到(通过子类)。
编译器说,当整个set
属性是内部的(即在程序集外部不可见)时,IP
受保护(即对程序集外的子类可见)是没有意义的。