我在同一个程序集中定义了一个接口和一个抽象基类:
IFoo.cs:
internal interface IFoo { ... }
Base.cs:
public abstract class Base
{
internal protected Base(IFoo foo) { ... }
}
这会生成以下编译器错误:
CS0051: Inconsistent accessibility: parameter type 'IFoo' is less
accessible than method 'Base.Base(IFoo)'
如果我将Base类构造函数设置为仅内部,则错误消失。由于该类是抽象的,因此可能在可访问性中添加protected不会实现任何目的......
不过,我不明白这个错误。 MSDN将“protected internal”定义为
“访问权限仅限于当前程序集或派生自 包含类“
内部接口IFoo 如何比内部受保护的构造函数更容易?
答案 0 :(得分:13)
This MSDN page将“受保护的内部”定义为(强调原文):
受保护的内部辅助功能级别表示受保护的OR 内部,不受保护和内部。换句话说,受保护 可以从同一程序集中的任何类访问内部成员, 包括派生类。限制只能派生的可访问性 在同一个程序集中的类,声明类本身是内部的,和 宣布其成员为受保护者。
换句话说,从Base
派生的当前程序集之外的类型可以访问Base(IFoo foo)
但是它们无法访问IFoo,因为它是内部的。因此错误。