3

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

obj2 = obj ?? null;
4

6 回答 6

11

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

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

  1. 想到
  2. 实施起来便宜
  3. 几乎总是错的
  4. 意外打字合理
  5. 可消除
  6. 稀有的
  7. 只能由编译器完成
  8. 测试时不明显

您提出的警告不符合要求 1 和 4。据我所知,您是第一个想到这一点的人,因此它不能成为警告,因为编译器团队中没有人想到它。而且不太可能是偶然输入的,那为什么要警告呢?当您输错可能会输错的内容时,会有警告告诉您。它也没有满足要求 3,因为代码没有明显错误,只是不必要的复杂。编译器也不会对x * 1where xis an integer 给出警告。

于 2013-06-22T05:31:20.467 回答
7

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

既不是:

i = i + 0;

但是编译器也没有抱怨这一点。为什么要呢?只要您的请求在语法上是正确的,编译器就会执行它被告知的事情 - 就是这样。

于 2013-06-21T20:35:27.023 回答
2

你的例子并不完全有意义,但像这样的事情;

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

在这里,我是说取三个中的第一个非空值,如果它们都是空的,那么就取空。

于 2013-06-21T20:35:16.550 回答
1

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

于 2013-06-21T20:34:13.470 回答
1

虽然该语句不是很有用,但它为什么会警告您?

如果obj不为空,obj2则分配给obj。否则obj2分配给null。这是完全合法的。

于 2013-06-21T20:35:09.473 回答
1

正如埃里克利珀特所说

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

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

于 2013-06-21T20:41:14.123 回答