繁体   English   中英

IComparable <T> .CompareTo()返回值?

[英]IComparable<T>.CompareTo() return values?

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

答案是:

IComparable<T>.CompareTo()返回sbyte, short, ushort, char类型的减法结果 ,而类型为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 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的方法的返回类型。

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

这是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM