我知道我可以通过添加自己的 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;
}
}
我不能将其称为重载,而是称其为重载。通过运行时的魔力,它确实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 时,即使所述变量已被装箱为对象类型,也应调用该变量。