Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么';t obj??null将导致编译器警告_C#_Compiler Warnings - Fatal编程技术网

C# 为什么';t obj??null将导致编译器警告

C# 为什么';t obj??null将导致编译器警告,c#,compiler-warnings,C#,Compiler Warnings,在引用类型与null合并的情况下,为什么这不是C#编译器中的编译器警告?这有意义吗 obj2 = obj ?? null; 您可以编写很多没有意义的东西,编译器不必将它们中的每一个都指向警告。虽然该语句不是很有用,但为什么它会警告您 如果obj不为空,则将obj2分配给obj。否则,将obj2分配给null。这是完全合法的。你的例子并不完全有意义,但像这样的例子是有意义的 d = a ?? b ?? c ?? null; 这里,我是说取三个值中的第一个非null值,如果它们都为null,那么

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

obj2 = obj ?? null;

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

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


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

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

d = a ?? b ?? c ?? null;
这里,我是说取三个值中的第一个非null值,如果它们都为null,那么就取null。

这很有意义,只是没有多大用处

也不是:

i = i + 0;
但是编译器也没有对此抱怨。 为什么要这样做?只要您的请求在语法上是正确的,编译器就会按照要求执行操作

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

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

您应该阅读

简而言之:要使编译器警告存在,必须:

  • 想到
  • 实施成本低
  • 几乎总是错的
  • 由于意外而合理地打字
  • 可消除
  • 稀罕
  • 只能由编译器完成
  • 测试时不明显

  • 您建议的警告不符合要求1和4。据我所知,您是第一个想到这一点的人,因此它不能作为警告,因为编译器团队中没有人想到它。而且它不太可能是偶然输入的,那么为什么它应该是一个警告呢?当您输入了可能会被错误输入的内容时,会出现警告。它也不符合要求3,因为代码没有明显的错误,它只是不必要的复杂。编译器不会对
    x*1
    发出警告,其中
    x
    也是一个整数。

    这一行在优化过程中会被删除吗?@Travis有趣的问题-我不知道,但不会出错如果
    I
    int
    ,那么在LINQPad中的快速测试看起来会优化出加法。(用于
    i=i;
    的IL看起来与
    i=i+0
    完全相同)如果
    i
    是一个自定义类型,并且对于
    int具有隐式
    +
    操作符重载,那么它肯定足够聪明,不会对其进行优化。
    编辑:如果
    i
    float
    double
    (但不是十进制的)@Chris对细节的关注表示赞许——这超出了我在周五晚上的能力范围是的,C#编译器将优化常数0到整数的加法。它还将优化常数1的乘法。与
    d=a??b??C;
    有什么区别?@Danielpher在功能上没有区别。我认为对于读者来说,e-intent更为清晰,尤其是当他们不太熟悉空合并运算符时。这也是我得出的结论,它更为明确。