IEquatable<T>.Equals
Object.Equals
オーバーライドと一致する必要があります。具体的IEquatable<T>
に直接使用しても価値があるかどうかはわかりません。
ボックス化されたオブジェクトがボックス化されていない値を等価テストに使用することを確認したいだけのように思えます。次のような equals を使用して、必要なことのほとんどを実行できるはずです。
private static bool Equals<T1, T2>(T1 first, T2 second)
{
// if either are boxed, try Equals with unboxed values (dynamic)
if (typeof(T2) == typeof(object) && second.GetType().IsValueType)
{
dynamic dsec = second;
if (typeof(T1) == typeof(object) && second.GetType().IsValueType)
{
dynamic dfir = first;
return Equals(dfir, dsec);
}
return Equals(first, dsec);
}
if (typeof(T1) == typeof(object) && second.GetType().IsValueType)
{
dynamic dfir = first;
Equals<dynamic, T2>(dfir, second);
}
// neither are boxed, just fall back to their Equals overrides...
var t = Object.Equals(first, second);
return t;
}
Enumerable.Intersect
同じタイプのコレクションでExcept
のみ機能するため、タイプがそうであった場合は、Object
必要なことを行う必要があります。
アップデート:
値型は基本クラスから派生できません。それらの唯一の共通ベースは常にオブジェクトのみです。つまり、比較したい 2 つの型を知っているメソッドを特に使用せずに 2 つの異なる値の型を比較したい場合は、常に少なくとも 1 つの値をボックス化する必要があります。とにかく受け入れない。したがって、さまざまなメソッドを作成しないと不可能です。Enumerable.Intersect
Except
更新 2:
2 つの型を相互に変換できない場合 (または一方を他方に変換できない場合)、それらが等しくなることは決してないことを意味すると仮定するのは不適切な仮定です。例えば:
public struct One
{
public int Value;
public override int GetHashCode()
{
return Value.GetHashCode();
}
}
public struct Two
{
public int Value;
public override bool Equals(object obj)
{
if (obj is Two) return this == (Two)obj;
if (obj is One) return this.Equals((One)obj);
return base.Equals(obj);
}
public bool Equals(One one)
{
return one.Value == Value;
}
public static bool operator==(Two one, Two two)
{
return one.Value == two.Value;
}
public static bool operator !=(Two one, Two two)
{
return !(one == two);
}
public override int GetHashCode()
{
return Value.GetHashCode();
}
}
// ...
Console.WriteLine(two.Equals(one));
Console.WriteLine(two.Equals((Object)one));
Console.WriteLine(two.GetType().IsAssignableFrom(one.GetType()) || one.GetType().IsAssignableFrom(two.GetType()));
結果は、True、True、および False になります。したがって、明らかに 2 つのオブジェクトは「等しい」場合がありますが、相互に変換することはできません。