一個可能的原因是因爲Double.NaN。
對於== operator:MSDN說:如果通過使用相等運算符(==)測試兩個Double.NaN值是否相等,則結果爲false;兩個Double.NaN值不被認爲是相等的。如果通過調用Equals方法測試它們是否相等,則結果爲真。當您想要確定Double的值是否不是數字(NaN)時,另一種方法是調用IsNaN方法。
因此,==運算符和Double的Equals方法對Double.NaN有不同的行爲,我認爲這是爲什麼==是爲double覆蓋。至於int,沒有這種特殊情況。
的代碼演示的差異:
using System;
public class Example
{
public static void Main()
{
Console.WriteLine("NaN == NaN: {0}", Double.NaN == Double.NaN);
Console.WriteLine("NaN != NaN: {0}", Double.NaN != Double.NaN);
Console.WriteLine("NaN.Equals(NaN): {0}", Double.NaN.Equals(Double.NaN));
Console.WriteLine("! NaN.Equals(NaN): {0}", ! Double.NaN.Equals(Double.NaN));
Console.WriteLine("IsNaN: {0}", Double.IsNaN(Double.NaN));
Console.WriteLine("\nNaN > NaN: {0}", Double.NaN > Double.NaN);
Console.WriteLine("NaN >= NaN: {0}", Double.NaN >= Double.NaN);
Console.WriteLine("NaN < NaN: {0}", Double.NaN < Double.NaN);
Console.WriteLine("NaN < 100.0: {0}", Double.NaN < 100.0);
Console.WriteLine("NaN <= 100.0: {0}", Double.NaN <= 100.0);
Console.WriteLine("NaN >= 100.0: {0}", Double.NaN > 100.0);
Console.WriteLine("NaN.CompareTo(NaN): {0}", Double.NaN.CompareTo(Double.NaN));
Console.WriteLine("NaN.CompareTo(100.0): {0}", Double.NaN.CompareTo(100.0));
Console.WriteLine("(100.0).CompareTo(Double.NaN): {0}", (100.0).CompareTo(Double.NaN));
}
}
// The example displays the following output:
// NaN == NaN: False
// NaN != NaN: True
// NaN.Equals(NaN): True
// ! NaN.Equals(NaN): False
// IsNaN: True
//
// NaN > NaN: False
// NaN >= NaN: False
// NaN < NaN: False
// NaN < 100.0: False
// NaN <= 100.0: False
// NaN >= 100.0: False
// NaN.CompareTo(NaN): 0
// NaN.CompareTo(100.0): -1
// (100.0).CompareTo(Double.NaN): 1
代碼還爲MSDN
它幾乎看起來像文檔是不完整的或有幕後的東西,因爲從文檔頁面它說:「Int32類型支持標準的數學運算,如加法,減法,除法,乘法,否定和一元與其他整型類型一樣,Int32類型也支持按位AND,OR,XOR,左移和右移運算符 可以使用標準數字運算符來比較兩個Int32值,也可以調用CompareTo或等於方法。「 –
@TyCobb使用ILSpy發佈該帖子的人表明,該方法存在,所以可能表明它不是生成代碼..他也建議它反編譯。而且,我不懷疑它稱之爲Equals方法,但你能引用什麼來表明這一點? – barlop
@TyCobb看着Matt發佈的信息。第一個和第三個WriteLine()給出了不同的結果。所以==和.Equals行爲不一樣。所以,==不調用'.Equals(..)',同意? – barlop