请参见下面的代码。 在第一个>第二个下面有一个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;
}
答案 0 :(得分:2)
if (first.CompareTo(second) > 0) return first else return second;
答案 1 :(得分:2)
出现编译时错误的原因是,对类型的唯一限制是它实现了IComparable
,接口保证的唯一方法是CompareTo
方法,并且并非所有类型都实现比较运算符。
由于保证CompareTo
可用,因此您可以改用它。
还要注意,调用CompareTo
方法时应使用空条件运算符(?.
),因为存在first
为null
的可能性(在这种情况下, ,致电.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