相关疑难解决方法(0)

为什么.NET值类型被密封?

从C#结构继承是不可能的.这对我来说并不明白为什么会这样:

  • 显然,您不能拥有从值类型继承的引用类型; 这不行
  • 从一个原始类型(Int32,Double,Char等)继承它听起来是不合理的.
  • 您需要能够使用派生实例在基础上调用(非虚拟)方法.您可以从派生结构转换为基础,因为它们将重叠相同的内存.我想从基础到派生的转换是行不通的,因为你无法在运行时知道派生结构的类型.
  • 我可以看到您无法在类层次结构中实现虚方法,因为值类型不能包含虚拟成员

我想知道这是否是CLR中的技术限制,还是C#编译器阻止你做的事情?

编辑:值类型不能有虚拟方法,我意识到这个限制排除了大多数你想要使用继承的场景.但是,这仍然会留下继承 - 聚合.想象一个Shape带有Colour字段的结构:我可以编写接受任何结构派生的代码Shape,并访问其Colour字段,即使我永远不能编写虚Shape.Draw方法.

我可以想到一个会被非密封值类型破坏的场景.值类型都应该落实Equals和GetHashCode正确; 即使这两个方法System.Object都是虚拟的,它们也会在值类型上被非虚拟地称为.即使值类型没有被密封,编写从另一个派生的结构的人也无法编写自己的这两种方法的实现,并期望正确调用它们.

我应该指出,我并不是说我应该能够从我自己的代码中继承结构.但是,我想要做的是猜测为什么.NET禁止这种特殊代码气味.

编辑2:我刚刚发现了这个非常相似的问题,其答案实际上是"因为那时价值类型的数组不起作用".

.net c# struct

38
推荐指数
2
解决办法
6984
查看次数

标签 统计

.net ×1

c# ×1

struct ×1