支持IComparable时进行比较的语法

时间:2018-11-06 01:18:14

标签: c# class generics icomparable

请参见下面的代码。 在第一个>第二个下面有一个squigley红线 运算符不能应用于操作数OBJ和OBJ。

是否有一些简单的方法可以执行此处的操作?

public static OBJ Swap<OBJ>(ref OBJ first, ref OBJ second) where OBJ : IComparable
{
    OBJ temp = first;
    OBJ temp2 = second;
    second = temp;
    first = temp2;
    if (first > second) return first else return second;
}

3 个答案:

答案 0 :(得分:2)

 if (first.CompareTo(second) > 0) return first else return second;

答案 1 :(得分:2)

出现编译时错误的原因是,对类型的唯一限制是它实现了IComparable,接口保证的唯一方法是CompareTo方法,并且并非所有类型都实现比较运算符。

由于保证CompareTo可用,因此您可以改用它。

还要注意,调用CompareTo方法时应使用空条件运算符(?.),因为存在firstnull的可能性(在这种情况下, ,致电.CompareTo会抛出ArgumentNullException)。

您的其余代码也可以稍作简化。首先,您可以在决定退回哪个项目时使用三元运算符(?:)来略微缩短它。其次,在交换操作中,您只需要一个temp变量即可保存您重新分配的第一个变量的值。例如:

public static T Swap<T>(ref T first, ref T second) where T : IComparable
{
    var temp = first;
    first = second;
    second = temp;

    return first?.CompareTo(second) > 0 ? first : second;
}

在这种情况下,null值会抛出异常,但是上面的代码可以按预期工作:

string first = null;
string second = "2";

string largest = Swap(ref first, ref second);

答案 2 :(得分:1)

  

如果(i> j)有效,因为int支持IComparable。

不。这是不正确的。之所以有效,是因为它实现了comparison operators。例如:

static_cast<D*>(this)

这与IComparable无关,后者要求在实现类中定义单个 instance方法

public static bool operator >(MyClass l, MyClass r) {
    return l.Value > r.Value;
}

完全有可能创建一个实现IComparable的类,而无需比较运算符,反之亦然。

您使用public int CompareTo(object obj) { 所说的只是OBJ应该实现public static OBJ Swap<OBJ>(ref OBJ first, ref OBJ second) where OBJ : IComparable-并不暗示在此传递的类型将定义比较运算符。因此,编译器不允许您对可能未定义比较运算符的对象执行相等比较。

我知道您在考虑“但是编译器可以解决我在编译时传递的内容”,但是请记住,您的编译应用程序(即使是.exe格式)也可以由外部应用程序引用,该外部应用程序可以传递类型无效。

您应该改用IComparable

CompareTo