元组<>和IComparable<>

时间:2013-07-22 18:44:55

标签: .net tuples icomparable

考虑以下无辜的方法:

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的责任?或者也许是两者兼而有之,为了简单起见,做出了一个有意义的设计决策?

0 个答案:

没有答案