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

至少一个对象必须实现 IComparable

换句话说,Tuple<>声明它IComparable实际上在运行时不能保证。这也可以通过将类型参数约束为 be 来防止IComparable,但是Tuple<>不能用于非IComparable类,也许那时我们会被迫拥有Tuple<>ComparableTuple<>或类似的东西。

这是一个错误Tuple<T>,还是应该MySemiRandomComparer受到责备?或者两者兼而有之,做出了有意识的设计决定以保持简单?

4

0 回答 0