You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何从含internal抽象方法的跨程序集抽象类继承会报错?

关于C#跨程序集继承含internal抽象成员的抽象类的设计疑问

先看一下问题场景中的代码示例:

// 程序集A
public abstract class A {
    internal abstract void func();
}

// 程序集B
public class B : A {
    // 取消注释才能编译:internal override void func()
}

报错信息:B does not implement abstract member A.func()

我认为这个设计决策存在欠妥之处,下面是我的理由,同时也很想了解C#语言设计者选择当前实现的考量:

如果让我负责Roslyn中internal成员的相关实现,至少会生成类似**“B无法继承包含internal抽象成员的A”**的精准错误提示;理想情况下,我会新增一个closed关键字来直接禁止跨程序集继承,完全不需要借助internal抽象成员来实现这个限制。具体原因如下:

  • 假设抽象类A包含大量成员,当我们在另一个程序集中继承A,花费数天时间实现了大部分方法、逐个修复了各类错误后,突然发现最后一个无法解决的问题——必须实现一个根本无法访问的internal抽象成员,这显然非常不合理,完全是在浪费开发者的时间。
  • 当前编译器仅标记子类B存在未实现抽象成员的问题,但实际根源是不应该尝试继承这个基类A!编译器应该直接指出核心错误,而不是让开发者逐一去检查基类成员的访问修饰符。
  • 虽然能够限制基类被跨程序集继承是个有用的功能,但如果只是想限制继承却没有实际的internal成员需要定义,就不得不强行添加一个从未使用的internal抽象成员,这种“曲线救国”的方式实在难以理解——为什么C#设计者不直接新增类似closed的关键字来明确禁止跨程序集继承呢?
  • 我始终认为,在当前程序集内添加internal成员不应该成为影响外部程序集的破坏性变更。所以如果由我设计C#的这部分特性,会更倾向于使用closed关键字来实现跨程序集的继承限制,而非现在这种存在缺陷的internal抽象成员实现方式。

内容的提问来源于stack exchange,提问作者liamlim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:50:43