关于IComparable<T>.CompareTo()
方法的一个奇怪的问题;我知道该方法需要根据比较返回正数,负数或零,但实际上在前两种情况下我返回的是什么呢?换句话说,如果我返回+1或+1000,它会有所作为吗?
答案 0 :(得分:4)
答案是:
IComparable<T>.CompareTo()
为sbyte, short, ushort, char
类型返回 减法结果 ,同时返回 -1,0或1 类型为int
,long
,string
等。
var result = ((byte)10).CompareTo((byte)2); // 8
var result = ((short)1).CompareTo((byte)11); // -10
var result = ((int)10).CompareTo((int)11); // 1 ??
原因:
首先,让我们看一下方法的签名:
int CompareTo(T other)
如您所见,返回类型为Int32
。
很明显,开发人员希望返回值的差异。
但是,Int32
减法的返回类型可能小于Int32.MinValue
或大于Int32.MaxValue
。
例如,让我们来看看:
// Return type is less than minimum int value (-4294967296)
(Int32.MinValue).CompareTo(Int32.MaxValue)
// Return type is greater than maximum int value (4294967296)
(Int32.MaxValue).CompareTo(Int32.MinValue)
因此,他们已经决定返回类型的减法结果,该类型的值小于该方法的返回类型Int32
。
最后,您可以从here查看所有类型的该方法的实现:
Here is the Int16
implementation:
public int CompareTo(Int16 value) {
return m_value - value;
}
Here is the Int32
implementation:
public int CompareTo(int value) {
// Need to use compare because subtraction will wrap
// to positive for very large neg numbers, etc.
if (m_value < value) return -1;
if (m_value > value) return 1;
return 0;
}
最后:
但是,当然将来他们可以改变代码的实现,推荐的方法是将结果与1,0或-1进行比较,如msdn中所述。
小于零 (此实例在排序顺序中位于其他实例之前。)
零 (此实例在排序顺序中与其他位置相同。)
大于零 (此实例在排序顺序中跟随其他实例。)
答案 1 :(得分:2)
如果我返回+1或+1000会有什么影响吗?
不应该。但谨慎地说,两种方式都更安全:
< 0
,> 0