13

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

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)'

如果我只将基类构造函数设为内部,错误就会消失。由于该类是抽象的,因此向可访问性添加保护可能不会完成任何事情......

不过,我不明白这个错误。MSDN 将“受保护的内部”定义为

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

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

4

1 回答 1

21

此 MSDN 页面将“受保护的内部”定义为(强调来自原始内容):

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

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

于 2013-07-25T17:01:29.203 回答