我知道我可以通过添加自己的Equals实现来避免装箱。
public struct TwoDoubles
{
public double m_Re;
public double m_Im;
public TwoDoubles(double one, double two)
{
m_Re = one;
m_Im = two;
}
public override bool Equals(object ob)
{
return Equals((TwoDoubles)ob);
}
public bool Equals(TwoDoubles ob)
{
TwoDoubles c = ob;
return m_Re == c.m_Re && m_Im == c.m_Im;
}
}
我不太能称其为重写(override),倒更像是重载(overload)。在运行时的神奇作用下,根据调用者类型正确地调用
Equals()
实现。为什么我不能重写并将参数类型更改为
TwoDoubles
,让运行时的强制装箱按需发生?这是因为C#不支持参数逆变(如果是这个原因,那为什么不支持呢...从object o = new TwoDoubles()
看来只是一个小小的步骤)?更新 澄清一下,
object
是结构的继承层次结构的一部分。为什么我们不能指定更具体的类型作为参数来重写来自更抽象类型的实现?这样我们就可以编写: public override bool Equals(TwoDoubles ob)
{
TwoDoubles c = ob;
return m_Re == c.m_Re && m_Im == c.m_Im;
}
即使将变量装箱为对象类型,当变量为TwoDouble时应调用哪个函数。
ob
在重载函数中不是TwoDoubles
,则会抛出异常。在另一个函数中检查类型是没有意义的。 - MagnusEquals(object)
方法,你也应该覆盖GetHashCode()
方法。 - Jeff Mercado