0

我有一个辅助函数,它基本上在两个对象上调用 CompareTo,但会进行一些特殊的极端情况检查、转换等。

最初我是这样编写函数的:

public static bool BetterCompare(IComparable lhs, IComparable rhs, out retCode)
{
    ...
    retCode = lhs.CompareTo(rhs);
    ...
}

但问题是,如果我有一个class AwesomeClass : IComparable<AwesomeClass>. 事实上,我有几个,因为一些老IComparable班已经走了IComparable<T>。然而编译器很生气,因为它无法将这些新对象转换为IComparable. 我不知道这是否会使情况变得更糟,但其中一些是abstract(尽管抽象类确实提供了一个实现)。

如何传达“我想要两个可以调用 CompareTo 的对象”而不让编译器给我任何信息。最好,新功能不应该看起来像BetterCompare<AwesomeClass>(this, that, out retCode);,而只是“做正确的事”。或者有没有更好的方法来做到这一点,而无需触及每个班级,让他们 IComparableIComparable<T>

4

4 回答 4

9

您既可以AwesomeClass实现非泛型IComparable接口,也IComparable<T>可以编写泛型BetterCompare方法:

public static bool BetterCompare<T>(T lhs, T rhs, out retCode)
    where T : IComparable<T>
{
    ...
    retCode = lhs.CompareTo(rhs);
    ...
}

(请注意,这可以与您现有的方法一起使用。)

于 2009-07-02T16:18:40.057 回答
0

文档说:

Default 属性返回的对象使用System.Collections.Generic.IComparable<T>通用接口来比较两个对象。如果类型 T 未实现IComparable<T>泛型接口,则 Default 属性返回Comparer<T>使用该System.Collections.IComparable接口的 a。

于 2009-07-02T16:34:40.530 回答
0

您始终可以将变量更改为对象类型,然后使用反射来查看它们是否实现了其中一个接口,然后将它们转换为正确的接口。

注意:反射非常慢,因此请谨慎使用。

于 2009-07-02T16:23:33.350 回答
0

您可以查看Comparer<T>, 实现了IComparer<T>IComparer,并在适当的地方使用它。不过,它可能需要对您的代码进行一些重构。

于 2009-07-02T16:24:25.083 回答