考虑以下看起来很无辜的方法:
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
实际上在运行时不能保证。这也可以通过将类型参数约束为 be 来防止IComparable
,但是Tuple<>
不能用于非IComparable
类,也许那时我们会被迫拥有Tuple<>
和ComparableTuple<>
或类似的东西。
这是一个错误Tuple<T>
,还是应该MySemiRandomComparer
受到责备?或者两者兼而有之,做出了有意识的设计决定以保持简单?