【发布时间】:2014-01-19 05:58:09
【问题描述】:
当我试图定义一个继承自 System.ValueType 或 System.Enum 类的类时,我收到了一个错误:
Cannot derive from special class System.ValueType
我理解这个错误,但我不明白是什么让ValueType 类特殊?我的意思是没有关键字(如sealed)或属性来指定这个类不能被继承。ValueType 有两个属性,Serializable 和ComVisible,但它们都与这种情况无关。@ 987654321@ 说:
虽然 ValueType 是值类型的隐式基类,您不能创建直接从 ValueType 继承的类。 相反,各个编译器会提供语言关键字或构造(例如 C# 中的 struct 和 Structure ...结束 Visual Basic 中的结构)以支持创建值类型。
但它没有回答我的问题。所以我的问题是在这种情况下如何通知编译器?当我尝试创建继承自一个类的类时,编译器是否直接检查该类是ValueType 还是Enum?
编辑:所有结构 implicitly 都继承自 ValueType,但 Enum 类 显式 继承自 ValueType,那么它是如何工作的?编译器是怎么判断出这种情况的,这些都是编译器硬编码的?
【问题讨论】:
-
是的,我希望像这样的规则(同样适用于
Delegate)在编译器代码中被硬编码,只是为了匹配语言规范。 -
是的,它可能是正确的。但据我所知,在这些情况下使用属性和预处理器指令来通知编译器。创建一个属性来指定这个类不是更合适吗?是特殊的,不能被继承而不是硬编码?
-
@Selman22 - 根据我以前从 C# 团队的主要成员那里看到的关于 SO 的答案,听起来好像这些整数类型的绑定是硬编码到编译器中的。继承层次结构是 C# 语言设计的一个组成部分,使用属性或其他方式来描述基继承类型关系是违反直觉的。
-
@M.Babcock 我明白你的意思。我在等也许有人能清楚地解释这个原因。我也想知道 Enum 类是从 ValueType 继承的,编译器是否也硬编码?
标签: c# inheritance compiler-errors