独自の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()
です)?
UPDATE
の
明確化: object
構造体の継承階層の一部です。派生型の少ない型からの実装をオーバーライドするために、派生型の多い型をパラメーターとして指定できないのはなぜですか?これにより、次のように書くことができます。
public override bool Equals(TwoDoubles ob)
{
TwoDoubles c = ob;
return m_Re == c.m_Re && m_Im == c.m_Im;
}
これは、変数がオブジェクトタイプにボックス化されている場合でも、変数がTwoDoubleの場合に呼び出す必要があります。