IComparable<T>.CompareTo() return values?

本文关键字:return values gt lt IComparable CompareTo | 更新日期: 2023-09-27 18:00:07

只是一个关于IComparable<T>.CompareTo()方法的奇怪问题;我知道该方法需要根据比较返回正、负或零,但在前两种情况下,我返回什么真的重要吗?换句话说,如果我返回+1或+1000,会有什么不同吗?

IComparable<T>.CompareTo() return values?

答案是:

对于sbyte, short, ushort, char类型,IComparable<T>.CompareTo()返回减法结果,而对于intlongstring等类型,它返回-1.0或1

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其他)

如您所见,返回类型为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"小"的类型的相减结果。

最后,您可以从这里查看该方法在所有类型中的实现:

以下是Int16实现:

   public int CompareTo(Int16 value) {
            return m_value - value;
        }

以下是Int32的实现:

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或+1000会有什么不同吗?

不应该。但警告说最好是双向安全:

  • 始终返回-1,0,+1
  • 始终使用< 0> 0