【问题标题】:Why is resharper making the following recommendation?为什么 resharper 提出以下建议?
【发布时间】:2009-02-26 19:25:11
【问题描述】:

我的代码是...

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));
}

【问题讨论】:

  • 就是这样的东西,让 resharper 的钱翻了十倍。
  • 有趣的问题 +1,请您在标题中添加更多信息,以便下次更容易找到说“为什么 resharper 建议用 Equals 替换 val == null (val,default (T))" 谢谢。

标签: c# resharper


【解决方案1】:

因为它不知道T 是值类型还是引用类型,所以它使代码两者都可以工作。

【讨论】:

  • 所以如果我想执行以下操作以确保它是 ref 类型,我应该为 XXX 设置什么? public static void AssertNotNull(string name, T val) where T : XXX
  • nm Michael Meadows 回答了那部分
  • 我实际上不同意 Resharper 在这种情况下,如果这就是它给出错误的原因。想想看,如果 T 是一个 int,并且值实际上是 0 并且应该为零,它会抛出异常,而如果你检查 null,它不会抛出异常。
  • 该建议肯定是错误的,但它确实需要标记这一点,因为它是一个静态代码错误。 API 不应允许值类型调用方法调用 AssertNotNull。
  • @jayrdub:“其中 T:类”。然后你可以检查null。
【解决方案2】:

我支持 Berado 的回答,但要补充一点,您可以通过添加以下约束来防止这种情况:

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

【讨论】:

    【解决方案3】:

    这显然不是在这种情况下你想要的,但它只是试图提供帮助,确保你不会因为忘记引用类型可用于@而引入错误987654322@。就像@Michael Meadows 所说的那样,您可能希望将class 约束添加到T

    【讨论】:

      【解决方案4】:

      这两种方法是不等价的。第一个允许 AssertNotNull( "foo", 0 ) 而第二个抛出。我认为 Resharper 在这种情况下过于热心了。

      【讨论】:

      • 你的观点是正确的。 Resharper 默认将其标记为警告(黄色)。它只是想警告您,此方法不会对所有可能的输入按预期工作。
      • er,一个修订版: AssertNotNull("foo", 0) 不会抛出异常,它会表现得像一个空值,因为 int 的默认值为 0,因此 Equals(val , default(T)) 计算结果为真。
      • 我的意思是“throw new ArgumentNullException”将在第二种方法中运行。你同意吗?
      【解决方案5】:

      我想是因为 T 可能是非引用类型。

      【讨论】:

        【解决方案6】:

        如果您知道 T 将始终是一个类,则添加一个 where 子句来说明,那么您的原始代码就可以了。

        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));
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-19
          • 1970-01-01
          相关资源
          最近更新 更多