为什么不obj ?? null导致编译器警告

时间:2013-06-21 20:33:13

标签: c# compiler-warnings

在引用类型与null合并的情况下,为什么这不是C#编译器中的编译器警告?这有什么意义吗?

obj2 = obj ?? null;

6 个答案:

答案 0 :(得分:11)

您应该阅读my essay on the subject

简单地说:为了使编译器警告存在,它必须是:

  1. 想到
  2. 廉价实施
  3. 几乎总是错的
  4. 合理打字
  5. Eliminatable
  6. 稀土
  7. 只能由编译器完成
  8. 测试时不明显
  9. 您建议的警告不符合要求1和4.据我所知,您是第一个想到这一点的人,因此它不能成为警告,因为编译器团队中没有人想到它。并且它不太可能被意外打字,那为什么它应该是一个警告呢?当您错误输入可能错误的内容时,会有警告告诉您。它也失败了要求3,因为代码显然不是错误,它只是不必要的复杂。编译器不会为x * 1提供警告,其中x也是整数。

答案 1 :(得分:7)

它使有意义,它只是不是很有用。

两者都不是:

i = i + 0;

但编译器也没有抱怨。 为什么要这样?只要您的请求在语法上是正确的,编译器就会执行它所说的内容 - 它就是这样。

答案 2 :(得分:2)

你的例子并不完全有意义,但这样的事情确实如此;

d = a ?? b ?? c ?? null;

在这里,我说的是取三个的第一个非空值,如果它们全部为空,则只取空。

答案 3 :(得分:1)

你可以编写很多没有意义的东西,编译器不必将它们中的每一个都指向一个警告。

答案 4 :(得分:1)

虽然声明不是很有用,但为什么会警告你?

如果obj不为空,则会将obj2分配给obj。其他obj2已分配给null。这是完全合法的。

答案 5 :(得分:1)

作为Eric Lippert said

  

我们试图仅针对那些我们几乎可以肯定地说代码被破坏,误导或无用的情况保留警告

因此警告用于代码,虽然在语法上是正确的,但可能会导致真正的问题。