无证行为!和??操作者

时间:2018-01-17 22:10:01

标签: c# .net

如何阅读

!nullableboolean ?? false 

nullableboolean == null等于false时。

根据:

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

!强于??

它也与

不同
!(nullableboolean ?? false)

nullableboolean == null等于true时。

但是!nullableboolean == null这似乎没有记载。当然!null无法编译。也许它只能与??一起使用。因此,??可能有一个未记录的对应操作符! ??,但!null ?? false也无法编译。

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

2 个答案:

答案 0 :(得分:7)

在空! will produce null上使用boolean?运算符。 Documentation:

  

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

答案 1 :(得分:6)

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

  

如何阅读!nullableboolean ?? false

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

相同
  

它也与!(nullableboolean ?? false)

不同

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

的语义
  

但是!nullableboolean == null

如果nullableboolean为null,则其反转也为空,正确。与#34;相反;我不知道这是真是假?"是"我不知道这是假的还是真的"。你还是不知道。

  

这似乎没有记载。

不是。

  

当然!null没有编译。

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

但正常规则的这种例外的一个很好的理由是,它几乎总是一个错误!如果" null bool?"打算然后(bool?)nulldefault(bool?)new bool?()都会更好。如果没有意图,那么代码是错误的。无论哪种方式,都可以安全地拒绝。

如果我有空闲时间,我会查看代码,看看我是否能回忆起这项检查的实施位置。

  

也许它只与??

一起使用

没有

  

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

没有

  

!null ?? false也无法编译。

正确;再次!null被某些特殊规则拒绝。

  

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

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

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