2010-02-26 38 views
40

我有幾個地方需要比較2(空)值,看看它們是否相同。如何比較可空類型?

我認爲應該有東西在支持這個框架中,卻找不到任何東西,這樣反而有以下幾點:

public static bool IsDifferentTo(this bool? x, bool? y) 
{ 
    return (x.HasValue != y.HasValue) ? true : x.HasValue && x.Value != y.Value; 
} 

然後,在代碼中我有if (x.IsDifferentTo(y)) ...

然後我有可空類型,可爲空雙打等類似的方法

是否有一種更簡單的方法來查看兩個可爲空的類型是否相同?

更新:

事實證明,這種方法存在的原因是因爲代碼已經從VB.Net,其中沒有=沒有返回false轉換(與C#其中null == NULL返回true) 。 VB.Net代碼應該使用.Equals...來代替。

+2

有點晚於這一點,但我發現更新有用的。遇到同樣的場景 – 2013-04-09 16:36:16

回答

59

C#支持「解禁」的運營商,因此,如果類型(bool?在這種情況下)是在編譯知道你就應該能夠使用:

return x != y; 

如果你需要仿製藥,然後EqualityComparer<T>.Default是你的朋友:

return !EqualityComparer<T>.Default.Equals(x,y); 

但是請注意,這兩種方法都使用「null == null」方法(與ANSI SQL相反)。如果你需要「null != null」,那麼你就必須單獨測試:

return x == null || x != y; 
5

您可以使用System.Object的靜態Equals方法:

var equal = object.Equals(objA, objB); 
25
+3

+1與C#和VB.Net一起工作。 – Crono 2014-08-07 13:34:23

+0

其他答案都聲稱當x和/或y是可空的'的實例時,'x.Equals(y)'和'x == y'工作得很好。鏈接的方法有何不同?什麼時候應該使用它? – MarioDS 2016-03-29 14:02:16

+1

或'Nullabe.Compare '如果您正在尋找'IComparable 'impl – Sepehr 2016-10-28 17:09:05

5

只需使用==,或者.Equals()

17
if (x.Equals(y)) 
+0

你能告訴我爲什麼這個downvote。只是想知道我錯在哪裏。 – Kashif 2010-02-26 16:01:03

+0

我沒有讓你失望,但是如果x爲空,會發生什麼?在空引用上調用方法可能會導致NullReferenceException。 – 2010-03-30 16:08:02

+8

@Chris:你應該再次提出答案。可空類型'T?'不是引用類型,它是'System.Nullable '。這是一個結構,所以:一個值類型。 Muhammad的代碼完全合法,如果x爲null,則不會拋出NullReferenceException。 – Slauma 2010-11-15 19:36:24