C# 支持IComparable时用于比较的语法

C# 支持IComparable时用于比较的语法,c#,class,generics,icomparable,C#,Class,Generics,Icomparable,请参阅下面的代码。 在first>second下面有一条弯曲的红线 运算符不能应用于操作数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;

请参阅下面的代码。 在first>second下面有一条弯曲的红线 运算符不能应用于操作数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;
}
公共静态OBJ交换(参考OBJ第一,参考OBJ第二),其中OBJ:IComparable
{
OBJ温度=第一;
OBJ temp2=秒;
秒=温度;
第一个=temp2;
如果(第一个>第二个)返回第一个,否则返回第二个;
}
If(i>j)之所以有效,是因为int支持IComparable

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

public static bool operator >(MyClass l, MyClass r) {
    return l.Value > r.Value;
}
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;
}
这与需要在实现类中定义单个实例方法的类无关:

public int CompareTo(object obj) {
完全可以创建一个实现IComparable的类,而不使用比较运算符,反之亦然

使用
公共静态OBJ Swap(ref-OBJ first,ref-OBJ second),其中OBJ:IComparable
的意思是OBJ应该实现
IComparable
——这里传递的类型并不意味着将定义比较运算符。因此,编译器不允许您对可能未定义比较运算符的对象执行相等比较

我知道您在想“但是编译器可以计算出我在编译时传递的内容”,但请记住,您编译的应用程序(即使是.exe形式)可能会被外部应用程序引用,而外部应用程序可能会传递无效类型

您应该改为使用
CompareTo

return a.CompareTo(b) > 0 ? a : b;
If(i>j)之所以有效,是因为int支持IComparable

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

public static bool operator >(MyClass l, MyClass r) {
    return l.Value > r.Value;
}
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;
}
这与需要在实现类中定义单个实例方法的类无关:

public int CompareTo(object obj) {
完全可以创建一个实现IComparable的类,而不使用比较运算符,反之亦然

使用
公共静态OBJ Swap(ref-OBJ first,ref-OBJ second),其中OBJ:IComparable
的意思是OBJ应该实现
IComparable
——这里传递的类型并不意味着将定义比较运算符。因此,编译器不允许您对可能未定义比较运算符的对象执行相等比较

我知道您在想“但是编译器可以计算出我在编译时传递的内容”,但请记住,您编译的应用程序(即使是.exe形式)可能会被外部应用程序引用,而外部应用程序可能会传递无效类型

您应该改为使用
CompareTo

return a.CompareTo(b) > 0 ? a : b;

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

但是,由于保证可用,您可以使用它

还要注意,在调用
CompareTo
方法时,应该使用null条件运算符(),因为
第一个
可能是
null
(在这种情况下,调用
。CompareTo
将抛出
ArgumentNullException

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

public static bool operator >(MyClass l, MyClass r) {
    return l.Value > r.Value;
}
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;
}

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

但是,由于保证可用,您可以使用它

还要注意,在调用
CompareTo
方法时,应该使用null条件运算符(),因为
第一个
可能是
null
(在这种情况下,调用
。CompareTo
将抛出
ArgumentNullException

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

public static bool operator >(MyClass l, MyClass r) {
    return l.Value > r.Value;
}
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;
}

也许您需要使用
CompareTo
方法?您应该查阅文档:无论OBJ是什么类的占位符,该类都应该支持CompareTo。如果操作员>正常工作,请不要担心。为什么会出现语法问题?
IComparable
接口不强制执行比较运算符的实现,只执行
CompareTo
方法。请改用它。@Kam运算符实现独立于IComparable.CompareTo实现。两者之间没有强制连接,这只是在实现IComparable接口时实现操作符的一般指南。但这不是必须的,运算符和CompareTo的结果也可能不同-尽管不建议这样做。也许您需要使用
CompareTo
方法?您应该参考文档:无论OBJ是占位符用于什么类,该类都应该支持CompareTo。如果操作员>正常工作,请不要担心。为什么会出现语法问题?
IComparable
接口不强制执行比较运算符的实现,只执行
CompareTo
方法。请改用它。@Kam运算符实现独立于IComparable.CompareTo实现。两者之间没有强制连接,这只是在实现IComparable interf时实现操作符的一般指南