2009-02-26 71 views
7

我的代碼是...爲什麼resharper提出以下建議?

public static void AssertNotNull<T>(string name, T val) { 
    if (val == null) 
     throw new ArgumentNullException(String.Format("{0} must not be null", name)); 
} 

ReSharper的是推薦...

public static void AssertNotNull<T>(string name, T val) { 
    if (Equals(val, default(T))) 
     throw new ArgumentNullException(String.Format("{0} must not be null", name)); 
} 
+0

這樣的事情使得resharper值得十倍的錢。 – 2009-02-26 19:30:31

+1

有趣的問題+1,只有一件事情,請你把更多的信息放入標題中,以便下次找到時更容易說「爲什麼resharper建議用Equals(val,default(T))替換val == null」謝謝。 – 2009-02-26 19:42:45

回答

13

因爲它不知道是否T是值類型或引用類型,所以它使代碼工作既。

+0

所以如果我想做下面的事情來確定它是一個ref類型的話,我爲XXX做了什麼? public static void AssertNotNull (字符串名稱,T val)其中T:XXX – JeremyWeir 2009-02-26 19:28:28

+0

nm Michael Meadows回答了那部分 – JeremyWeir 2009-02-26 19:29:27

12

我第二Berado的答案,但想補充一點,你可以通過添加下面的約束防止這種情況:

public static void AssertNotNull<T>(string name, T val) where T : class 
1

這兩種方法是不等價的。第一個允許AssertNotNull(「foo」,0),而第二個拋出。我認爲Resharper在這種情況下是過分熱情的。

2

這顯然不是你在這種情況下想要的東西,但它只是想對大家有所幫助,確保你不要忘了,引用類型可用於T引入的錯誤。就像@Michael Meadows所說的那樣,您可能想要將class約束添加到T

0

我想因爲T可能是一個非引用類型。

0

如果你知道T將永遠是一個類,然後添加一個where子句來說,那麼你的原始代碼就OK了。

public static void AssertNotNull<T>(string name, T val) 
    where T : class 
    { 
     if (val == null) 
      throw new ArgumentNullException(String.Format("{0} must not be null", name)); 
    } 
相關問題