首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何混合/修复IComparable和IComparable<T>混乱

如何混合/修复IComparable和IComparable<T>混乱
EN

Stack Overflow用户
提问于 2009-07-02 16:14:49
回答 4查看 1.6K关注 0票数 1

我有一个助手函数,它基本上在两个对象上调用CompareTo,但是做一些特殊的角情况检查、转换等等。

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

代码语言:javascript
复制
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>

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-07-02 16:18:40

您可以让AwesomeClass实现非通用IComparable接口以及IComparable<T>,也可以编写一个通用的BetterCompare方法:

代码语言:javascript
复制
public static bool BetterCompare<T>(T lhs, T rhs, out retCode)
    where T : IComparable<T>
{
    ...
    retCode = lhs.CompareTo(rhs);
    ...
}

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

票数 9
EN

Stack Overflow用户

发布于 2009-07-02 16:23:33

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

注意:反射太慢了,所以要小心使用。

票数 0
EN

Stack Overflow用户

发布于 2009-07-02 16:24:25

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1075295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档