无证行为!和?? 操作者

Wou*_*ter 0 .net c#

应该怎么读

!nullableboolean ?? false 
Run Code Online (Sandbox Code Playgroud)

nullableboolean == null它等于false.

根据:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/

! 结合力强于 ??

它也不同于

!(nullableboolean ?? false)
Run Code Online (Sandbox Code Playgroud)

nullableboolean == null它等于true.

但后来!nullableboolean == null这似乎没有记载.当然!null不编译.也许它只能与...一起使用??.所以也许??有一个没有文档的对应操作符! ??,但!null ?? false也没有编译.

有人知道一些解释或文件吗?

Ry-*_*Ry- 7

!在null上使用运算符boolean? 将产生null.文档:

预定义的一元和二元运算符以及值类型存在的任何用户定义的运算符也可以由可空类型使用.如果操作数为null,则这些运算符产生空值 ; 否则,运算符使用包含的值来计算结果.


Eri*_*ert 6

瑞安的回答是正确的; 解决你的许多其他问题:

应该怎么读 !nullableboolean ?? false

这与(!nullableboolean) ?? false以下相同bool? temp = !nullableboolean ... temp.HasValue ? temp.Value : false

它也不同于 !(nullableboolean ?? false)

正确.这将具有语义!(nullableboolean.HasValue ? nullableboolean.Value : false)

但是之后 !nullableboolean == null

如果nullableboolean为null,则其反转也为null,正确.与"我不知道这是真还是假"相反的是"我不知道这是假的还是真的".你还是不知道.

这似乎没有记载.

它不是.

当然!null不编译.

我不记得这个或在Roslyn代码中确定的原因.重载分辨率可以推断出没有适用的用户定义的运算符 - 因为它们是按类型查找的,而null没有类型 - 并且唯一的内置运算符是提升的!运算符.

但正常规则的这种例外的一个很好的理由是它几乎总是一个错误!如果"一个空博?" 意图当时(bool?)null或者default(bool?)或者new bool?()都是优选的.如果不是这样,那么代码是错误的.无论哪种方式,都可以安全地拒绝.

如果我有空闲的时刻,我将查看代码,看看我是否能回想起这个检查的实施位置.

也许它只能与??一起使用?

没有.

也许吧?有一个无证件的对应操作员!??

没有.

!null ?? false 也不编译.

正确; !null一些特殊规则再次拒绝了.

有人知道一些解释或文件吗?

阅读规范.我关于如何编写可空算术优化器的文章也可能对您感兴趣:

https://ericlippert.com/2012/12/20/nullable-micro-optimizations-part-one/