C# 为什么';t obj??null将导致编译器警告
在引用类型与null合并的情况下,为什么这不是C#编译器中的编译器警告?这有意义吗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,那么
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更为清晰,尤其是当他们不太熟悉空合并运算符时。这也是我得出的结论,它更为明确。