次の無害な方法を検討してください。
Random random = new Random();
public int MySemiRandomComparer<T>(T a, T b)
{
if (typeof(IComparable).IsAssignableFrom(typeof(T)))
return Comparer<T>.Default.Compare(a, b);
else
return random.Next(-1, 2);
}
ただし、このコードは失敗します。
MySemiRandomComparer(
Tuple.Create(new SomeNonComparableClass()),
Tuple.Create(new SomeNonComparableClass()));
具体的には、次のエラーで失敗しますArgumentException
。
少なくとも 1 つのオブジェクトが IComparable を実装する必要があります
つまり、実際には実行時に保証されない場合であることTuple<>
を宣言します。これは、型パラメーターを同様にIComparable
制約することで防止できた可能性がありますが、非クラスで使用することはできませんでした。IComparable
Tuple<>
IComparable
Tuple<>
ComparableTuple<>
これは のバグですかTuple<T>
、それともMySemiRandomComparer
責任がありますか? それとも、物事をシンプルに保つために意識的な設計上の決定が行われた場合、両方のビットでしょうか?