当在字典中用作键时,重写结构体的GetHashCode会导致装箱

本文关键字:GetHashCode 结构体 重写 字典 | 更新日期: 2023-09-27 17:54:28

通常,如果一个结构体实现了一个接口,将该结构体赋值给一个接口变量会导致装箱,例如:

interface IFoo {}
struct S : IFoo {}
S s = ...
IFoo f = s; // boxing here

然而也有例外。实现IEquatable<T>并在字典中使用这样的结构体作为键,似乎不会导致装箱。那么问题是,如果我只是覆盖GetHashCode而不实现IEquatable<T>呢?它会不会属于某种特殊情况?

当在字典中用作键时,重写结构体的GetHashCode会导致装箱

如果你不实现IEquatable<T>,那么在调用Equals时结构将被装箱。Equals是一个虚方法,因此需要一个引用来获取相关的方法表。