内部接口*less*可访问内部受保护的构造函数?

Sco*_*ith 8 c# protected internal

我有一个接口和一个在同一个程序集中定义的抽象基类:

IFoo.cs:

internal interface IFoo { ... }
Run Code Online (Sandbox Code Playgroud)

Base.cs:

public abstract class Base
{
    internal protected Base(IFoo foo) { ... }
}
Run Code Online (Sandbox Code Playgroud)

这会生成以下编译器错误:

CS0051: Inconsistent accessibility: parameter type 'IFoo' is less
        accessible than method 'Base.Base(IFoo)'
Run Code Online (Sandbox Code Playgroud)

如果我将Base类构造函数设置为仅内部,则错误消失.由于该类是抽象的,可能在可访问性中添加受保护并不能完成任何事情......

不过,我不明白这个错误.MSDN将'protected internal'定义为

"访问仅限于当前程序集或从包含类派生的类型"

内部接口IFoo如何比内部受保护的构造函数更难访问?

Tim*_*Tim 15

此MSDN页面将"protected internal"定义为(强调原始版本):

受保护的内部可访问性级别表示受保护的OR内部,而非受保护的AND内部.换句话说,可以从同一程序集中的任何类访问受保护的内部成员,包括派生类.要限制仅对同一程序集中的派生类的可访问性,请将类本身声明为内部,并将其成员声明为protected.

换句话说,派生自当前程序集之外的类型Base可以访问Base(IFoo foo)但是它们不能访问IFoo,因为它是内部的.因此错误.