我想创建一个内部自动属性:
internal bool IP { get; protected internal set; }
我认为可以使 setterprotected
或protected internal
- 但我总是得到错误可访问性修饰符必须比属性更具限制性。不是这样吗?Private
对我没有帮助,在这里。
编辑:
问题是:如何使用内部 getter 和受保护的 setter 实现自动属性?
我想创建一个内部自动属性:
internal bool IP { get; protected internal set; }
我认为可以使 setterprotected
或protected internal
- 但我总是得到错误可访问性修饰符必须比属性更具限制性。不是这样吗?Private
对我没有帮助,在这里。
编辑:
问题是:如何使用内部 getter 和受保护的 setter 实现自动属性?
它实际上是protected
or internal
,而不是and。派生类和同一程序集中的类型都可以访问它。认为protected internal
仅对同一程序集中的派生类可访问的方法是一种常见的误解。
在 .NET 级别,有两个相似但不同的访问级别:
C# 中的“受保护的内部”是指 FamilyOrAssembly;FamilyAndAssembly 没有修饰符。
因此,您的protected internal
设置器比internal
整体属性的限制更少。你可以做的是:
protected internal bool IP { internal get; set; }
但是你的 setter 比你的 getter 受到的限制更少,这很奇怪......
另一个(有点等价的)替代方案是:
internal bool IP { get; set; }
protected void SetIP(bool ip)
{
this.IP = ip;
}
我会考虑这种作弊,因为 Eric Lippert 本人也在 SO 上,但他写了一篇很棒的博客文章来考虑这个问题。
最终,他的答案与这里的海报给出的答案基本相同,但他在语言设计和这些功能的实现背后提出了一些有趣的推理。
考虑到 Jon Skeet 提到的内容(以及 user59808 的评论),这不会达到预期的结果吗?
protected internal bool IP { get; protected set; }
protected internal
比其中任何一个限制更少,protected
或者internal
因为它允许其子类 ( protected
) 和同一程序集 ( internal
) 中的任何内容访问某些内容。
受保护的内部意味着对同一程序集中的类或从包含类派生的类可见 - 换句话说,它对那些满足内部要求或受保护要求的人可见,而不是 AND。以这种方式没有访问修饰符意味着受保护和内部。
受保护的内部是指受保护的或内部的,而不是受保护的和内部的。因此范围仅限于相同的程序集或派生类,不一定两者兼而有之。
可访问性修饰符必须比属性更具限制性
内部比受保护的限制更大:因为受保护的东西可以在程序集之外(通过子类)看到。
set
编译器说,当整个IP
属性是内部的(即在程序集之外不可见)时,说它是受保护的(即对程序集外部的子类可见)是没有意义的。