考虑以下看起来很无辜的方法:
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受到责备?或者两者兼而有之,做出了有意识的设计决定以保持简单?