C# 如何混合/修复IComparable和IComparable<;T>;混乱

C# 如何混合/修复IComparable和IComparable<;T>;混乱,c#,generics,icomparable,C#,Generics,Icomparable,我有一个helper函数,它基本上在两个对象上调用CompareTo,但执行一些特殊的角大小写检查、转换等 最初我编写的函数是这样的: public static bool BetterCompare(IComparable lhs, IComparable rhs, out retCode) { ... retCode = lhs.CompareTo(rhs); ... } 但问题是,如果我有一个类,那么它就是一个AwesomeClass:IComparable。事实

我有一个helper函数,它基本上在两个对象上调用CompareTo,但执行一些特殊的角大小写检查、转换等

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

public static bool BetterCompare(IComparable lhs, IComparable rhs, out retCode)
{
    ...
    retCode = lhs.CompareTo(rhs);
    ...
}
但问题是,如果我有一个
类,那么它就是一个AwesomeClass:IComparable
。事实上,我有几个旧的
IComparable
类已经消失了
IComparable
。然而,编译器很生气,因为它无法将这些新对象转换为
IComparable
。我不知道这是否会让情况变得更糟,但其中一些是
抽象的
(尽管抽象类确实提供了一个实现)


我如何表达“我想要两个可以调用CompareTo的对象”,而不让编译器给我任何口吻。优选地,新函数不应该看起来像
BetterCompare(这个,那个,out-retCode),但只是“做正确的事”。或者有没有更好的方法可以做到这一点,而不必触碰每一个类,使它们都
i可比较
i可比较

您可以让
AwesomeClass
实现非通用的
i可比较
接口以及
i可比较
,或者您可以编写一个通用的
BetterCompare
方法:

public static bool BetterCompare<T>(T lhs, T rhs, out retCode)
    where T : IComparable<T>
{
    ...
    retCode = lhs.CompareTo(rhs);
    ...
}
public static bool BetterCompare(左、右、外代码)
其中T:i可比较
{
...
retCode=lhs.CompareTo(rhs);
...
}

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

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

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

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

说明:


默认属性返回的对象使用
System.Collections.Generic.IComparable
Generic接口比较两个对象。如果类型T未实现
IComparable
通用接口,则默认属性返回使用
System.Collections.IComparable
接口的
比较器

您可以重载方法,但您需要更好的解决方案。谢谢。我试着用泛型来解决这个问题,但我不记得要限定(?)t。现在还没有-74951:)