gpt4 book ai didi

c# - 为什么在原始类型实例上调用 Object 类的某些函数需要装箱?

转载 作者:可可西里 更新时间:2023-11-01 09:07:48 24 4
gpt4 key购买 nike

我发现如果我运行以下代码行。

int i = 7;
i.GetHashCode(); //where GetHashCode() is the derived
//function from System.Object

没有装箱,但如果我调用 i.GetType()(System.Object 的另一个派生函数)代替 GetHashCode(),需要装箱才能调用 GetType(),为什么不能直接在基本类型实例上调用 GetType(),而无需装箱,而它是可能的调用 GetHashCode() 而不装箱?

最佳答案

这里的关键是 GetType()不是虚拟的,不能被覆盖。由于结构实际上是 sealed ,方法不能被重写超过结构,因此运行时和编译器可以将已被重写的结构方法视为静态调用。

如果您编写一个结构(很少见),您应该覆盖所有方法,例如 ToString() , Equals() , GetHashCode()正是出于这个原因。如果你不这样做,它必须装箱。然而,GetType() 不能被覆盖,因此需要装箱。

这实际上会导致 Nullable<T> 出现一些奇怪的边缘情况和拳击,因为一个空Nullable<T>盒子到null ,所以:

int i = obj.GetHashCode(); // fine
Type t = obj.GetType(); // boom

关于c# - 为什么在原始类型实例上调用 Object 类的某些函数需要装箱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2179366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com