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

edu*_*ing 3 c# compiler-warnings

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

obj2 = obj ?? null;
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 11

你应该阅读我关于这个主题的文章.

简而言之:为了使编译器警告存在,它必须是:

  1. 想到
  2. 实施起来很便宜
  3. 几乎总是错的
  4. 合理打字
  5. Eliminatable
  6. 罕见
  7. 只能由编译器完成
  8. 测试时不明显

您提出的警告不符合要求1和4.据我所知,您是第一个想到这一点的人,因此它不能成为警告,因为编译器团队中没有人想到它.它不太可能是偶然打字的,为什么它应该是一个警告呢?当你错误输入可能输入错误的内容时,会有警告告诉你.它也不符合要求3,因为代码显然不是错误的,它只是不必要地复杂化.编译器不会给出整数x * 1在哪里的警告x.


Mar*_*ell 7

这是有道理的,它只是不是很有用.

既不是:

i = i + 0;
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,C#编译器将优化整数的常数零加法.它还将通过常数1优化乘法. (2认同)