2

次の無害な方法を検討してください。

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制約することで防止できた可能性がありますが、非クラスで使用することはできませんでした。IComparableTuple<>IComparableTuple<>ComparableTuple<>

これは のバグですかTuple<T>、それともMySemiRandomComparer責任がありますか? それとも、物事をシンプルに保つために意識的な設計上の決定が行われた場合、両方のビットでしょうか?

4

0 に答える 0