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

Posted

技术标签:

【中文标题】内部接口 *比内部受保护的构造函数更不可访问?【英文标题】:internal interface *less* accessible than an internal protected constructor? 【发布时间】:2013-07-25 17:04: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 将“受保护的内部”定义为

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

内部接口 IFooless 如何比内部受保护的构造函数可访问?

【问题讨论】:

【参考方案1】:

This MSDN page 将“受保护的内部”定义为(强调来自原文):

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

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

【讨论】:

以上是关于内部接口 *比内部受保护的构造函数更不可访问?的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin:为什么构造函数参数默认具有“内部”可见性?

受保护的构造函数和可访问性

受保护的构造函数和可访问性

在类的构造函数上使用受保护的访问修饰符

继承时无法访问受保护的内部类

将 make_shared 与受保护的构造函数 + 抽象接口一起使用