考虑以下无辜的方法:
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
:
至少有一个对象必须实现IComparable
换句话说,Tuple<>
声明它是IComparable
,实际上它在运行时没有保证。这可以通过将类型参数约束为IComparable
来防止,但是Tuple<>
无法与非IComparable
类一起使用,也许我们会被迫有Tuple<>
和ComparableTuple<>
或类似的东西。
这是Tuple<T>
中的错误,还是MySemiRandomComparer
的责任?或者也许是两者兼而有之,为了简单起见,做出了一个有意义的设计决策?