2009-02-26 69 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)); 
    } 
相关问题