33

我想创建一个内部自动属性:

internal bool IP { get; protected internal set; }

我认为可以使 setterprotectedprotected internal- 但我总是得到错误可访问性修饰符必须比属性更具限制性。不是这样吗?Private对我没有帮助,在这里。

编辑:
问题是:如何使用内部 getter 和受保护的 setter 实现自动属性?

4

8 回答 8

51

它实际上是protectedor internal,而不是and。派生类和同一程序集中的类型可以访问它。认为protected internal仅对同一程序集中的派生类可访问的方法是一种常见的误解。

于 2009-06-30T14:10:34.963 回答
30

在 .NET 级别,有两个相似但不同的访问级别:

  • FamilyAndAssembly:比受保护或内部限制更严格
  • FamilyOrAssembly:比受保护或内部限制更少

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;
}
于 2009-06-30T14:13:51.633 回答
5

我会考虑这种作弊,因为 Eric Lippert 本人也在 SO 上,但他写了一篇很棒的博客文章来考虑这个问题。

为什么我不能从派生类访问受保护的成员,第三部分

最终,他的答案与这里的海报给出的答案基本相同,但他在语言设计和这些功能的实现背后提出了一些有趣的推理。

于 2009-06-30T14:20:49.373 回答
5

考虑到 Jon Skeet 提到的内容(以及 user59808 的评论),这不会达到预期的结果吗?

protected internal bool IP { get; protected set; }

于 2010-12-08T15:36:55.840 回答
2

protected internal比其中任何一个限制更少,protected或者internal因为它允许其子类 ( protected) 和同一程序集 ( internal) 中的任何内容访问某些内容。

于 2009-06-30T14:11:41.620 回答
1

受保护的内部意味着对同一程序集中的类或从包含类派生的类可见 - 换句话说,它对那些满足内部要求或受保护要求的人可见,而不是 AND。以这种方式没有访问修饰符意味着受保护和内部。

于 2009-06-30T14:11:49.123 回答
1

受保护的内部是指受保护的或内部的,而不是受保护的和内部的。因此范围仅限于相同的程序集或派生类,不一定两者兼而有之。

于 2009-06-30T14:12:38.967 回答
0

可访问性修饰符必须比属性更具限制性

内部比受保护的限制更大:因为受保护的东西可以在程序集之外(通过子类)看到。

set编译器说,当整个IP属性是内部的(即在程序集之外不可见)时,说它是受保护的(即对程序集外部的子类可见)是没有意义的。

于 2009-06-30T14:16:47.757 回答