C# 实现IComparable<;不自我>;

C# 实现IComparable<;不自我>;,c#,icomparable,C#,Icomparable,这可能是一个无关紧要的问题,但我没有找到任何关于这一点的信息:使t型实现I可比较(t和S是两种不同的类型)是“有害的”还是被认为是不好的做法 例如: class Foo : IComparable<int> { public int CompareTo(int other) { if (other < i) return -1; if (other > i) return 1; return 0;

这可能是一个无关紧要的问题,但我没有找到任何关于这一点的信息:使t型实现
I可比较(t和S是两种不同的类型)是“有害的”还是被认为是不好的做法

例如:

class Foo : IComparable<int>
{
    public int CompareTo(int other)
    {
        if (other < i) return -1;
        if (other > i) return 1;

        return 0;
    }

    private int i;
}
class Foo:i可比较
{
公共整数比较(整数其他)
{
如果(其他i)返回1;
返回0;
}
私人互联网i;
}

是否应该避免这种代码,如果是,为什么?

我至少会认为它是“奇怪的”-特别是在那个时候,比较不是对称的,这通常是正常比较合同的一部分。 如果有一个特定的情况,它比任何其他实现您想要做的事情都要简单,那也没关系——但我不能说我曾经遇到过这样的情况。类似这样的比较几乎总是用于对同质集合或类似集合进行排序


您是否考虑过某个特定的情况,或者这只是一个“为了利益”的问题?

实现这样的事情很有意思。但这不是一个好的做法

假设您看到如下代码:

Foo x = new Foo();

if( x.compareTo(15) > 0)
{
  //blah blah
}
你会说“哦,我的天哪!如何比较15和x?”? 这将降低代码的可读性

最好添加如下比较功能:
公共int大于私人int(int x)

我可以看出比较不同类的对象是有用的,但我不认为(t的)I可比较是正确的基础。要使这种比较真正起作用,对象必须有一个共同的规范形式,这意味着它们都派生自一个共同的祖先或实现一个共同的接口。我进一步建议,这个公共基础包括一个SecondChanceCompareTo方法,如果普通比较方法无法识别要比较的精确类型,则应将其自身传递给传入对象的SecondChanceCompare方法。

作为这类东西可能有用的例子,想象一个存储字符串的类家族;字符串可以存储为简单的字符串对象,但某些字符串可以存储为字符和重复计数,其他字符串可以存储为对较长字符串的引用以及起始偏移量和长度等。可以通过将两个字符串对象转换为“字符串”类型来比较它们然后进行比较,但在很多情况下,存在更好的比较方法。例如,如果一个字符串存储为“字符‘Z’重复100000次”,而另一个字符串存储为“文字字符串‘Dog’”,则前一个字符串可以通过观察后者的第一个字符小于“Z”来将自己与后者进行比较


请注意,基本的“文字字符串”对象可能不知道如何将自身与“重复字符”字符串对象进行比较,除非将后者转换为文字字符串(一种昂贵的操作),但它可以调用后者的“SecondChanceCompare”方法,它会知道如何将自己与文本字符串进行比较。

这是重载运算符,这实际上不是一回事。