![](/img/trans.png)
[英]Doing a CompareTo is giving an error Object must be of type int32
[英]Why do the SByte and Int32 CompareTo() methods behave differently?
如果您運行以下代碼:
SByte w = -5;
Console.WriteLine(w.CompareTo(0));
Int32 x = -5;
Console.WriteLine(x.CompareTo(0));
SByte y = 5;
Console.WriteLine(y.CompareTo(0));
Int32 z = 5;
Console.WriteLine(z.CompareTo(0));
然后你得到以下輸出:
-5
-1
5
1
為什么這些具有相同名稱的方法在MSDN文檔中的描述幾乎完全相同?
因為實現了SByte.CompareTo()
return m_value - value;
所以簡單的減法。 這工作,因為m_value
自動轉換為int
,和值的任意組合的不可能性是“合法”與int
。
使用兩個Int32
無法完成,因為例如Int32.MinValue.CompareTo(Int32.MaxValue)
將變為Int32.MinValue - Int32.MaxValue
,它將在int
范圍之外,實際上它實現為兩個比較:
if (m_value < value) return -1;
if (m_value > value) return 1;
return 0;
一般來說
CompareTo
返回值的唯一重要“事物”是它的符號(或者如果它是0)。 “價值”無關緊要。 CompareTo()
的返回值CompareTo()
是相同的。 CompareTo
不能用於測量數字之間的“距離”。 所以兩種實現都是等價的。
這樣做是完全錯誤的:
if (someValue.CompareTo(someOtherValue) == -1)
你必須永遠
if (someValue.CompareTo(someOtherValue) < 0)
為什么SByte.CompareTo
以這種方式構建
SByte.CompareTo
正在實現“無SByte.CompareTo
”比較(代碼中沒有if
,代碼流是線性的)。 處理器存在分支問題,因此無分支代碼可能比“分支”代碼更快,因此這種微優化。 顯然, SByte.CompareTo
可以寫成Int32.CompareTo
。
為什么任何負值等於-1(任何正值等於+1)
這可能是直接從C語言派生的: qsort函數,例如比較項使用用戶定義的方法,如:
指向比較兩個元素的函數的指針。
qsort重復調用此函數以比較兩個元素。 它應遵循以下原型:int compar(const void * p1,const void * p2);
將兩個指針作為參數(都轉換為const void *)。 該函數通過返回(以穩定和傳遞的方式)定義元素的順序:
返回值的含義
<0 p1指向的元素在p2指向的元素之前
0 p1指向的元素等效於p2指向的元素
> 0 p1指向的元素位於p2指向的元素之后
.CompareTo
如何在其他原始類型中實現?
SByte
, Byte
, Int16
, UInt16
, Char
都使用減法“方法”,而Int32
, UInt32
, Int64
, UInt64
都使用if
“方法”。
查看這兩種方法的來源,它們的實現方式不同:
public int CompareTo(sbyte value)
{
return (int)(this - value);
}
VS
public int CompareTo(int value)
{
if (this < value)
{
return -1;
}
if (this > value)
{
return 1;
}
return 0;
}
但這一切都不重要,因為返回值的符號是您應該檢查的唯一內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.