【问题标题】:Is it the C# compiler or the CLR that prohibits multiple inheritance是C#编译器还是CLR禁止了多重继承
【发布时间】:2013-08-07 15:53:50
【问题描述】:

正如标题所说。

这是 C# 编译器设置的限制还是 CLR 从根本上禁止它?

【问题讨论】:

标签: c# clr multiple-inheritance


【解决方案1】:

两者。

与 CLR 没有直接关联的 C# 语言(即 Mono AOT)不允许多重继承。

支持 C# 以外的语言的 CLR 类型系统也不支持多重继承。

【讨论】:

  • 嗨@SLaks,我研究了一下,在互联网上找不到任何关于C#编译器和CLR类型系统都强制不使用多重继承的信息。你介意参考像 msdn 这样的正式来源吗?提前致谢,
  • @Ami:整个系统是围绕每个具有单个基类的类进行设计的。查看相关文档或语法的任何部分。
  • 我知道 C# 设计为所有类都有一个基类。不过,我唯一无法验证的是 CLR 类型系统是否强制不使用 C# 编译器(可能还有其他编译器)的多重继承。从网上搜索我可以发现CLR确实支持多类继承的这个特性。所以我有点困惑。 CLR 会检查是否存在多个基类并阻止它,还是没有?
【解决方案2】:

CLR 禁止它。如果只是编译器,您可以在运行时使用反射来克服它。多重继承(除了通过接口)直接违反了 CLR 的类型系统。

【讨论】:

  • 如果没有语言支持,您将无法使用反射来创建具有多重继承的类型。您必须手动编写 IL。
  • @mageos:手动编写 IL(或者更确切地说是动态发出)是我(可能至少还有其他一些人)半定期地做的事情,以克服 C# 中的限制。
【解决方案3】:

至少有三个级别:

  • .NET 库:.NET 的类型系统不支持它(查看Type.BaseType 属性...它是Type,而不是Type[],所以甚至不支持未来)

  • IL 语言:我不知道,但可能不会,否则 Type 类型会有所不同(因为 IL 语言是与其他所有内容一起构建的)

  • C# 编译器:不,因为 C# 是 .NET 的首选语言,并且必须显示可以在 .NET 中完成的所有内容(几乎所有内容),而不会创建太多无法通过“普通”模拟的构造。网 。像 LINQ 和对象初始化器这样的语法糖是一回事(很容易被其他语言模仿),并行类型系统不是 :-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2021-02-15
    • 2020-11-26
    相关资源
    最近更新 更多