x !is T不是你想的那样,如果你在代码上运行dart format,你会发现它实际上是x! is T;也就是说,它使用的是 post-fix!运算符,该运算符Assertx不是null,然后执行正常的is T检查(因此产生与您预期相反的结果)。如果静态地知道x不可为空,则dart analyze应该生成一个警告,指出不必要地使用了空Assert运算符。 也许您的意思是比较x is! T和!(x is T)。这两个表达式之间没有逻辑差异。有一个linter规则建议应该首选is!,但它没有提供任何解释。我相信这是因为is!表面上读起来更好(“is not”),并且比对括号中的表达式求反要简单(然而,这种立场早于空安全,并且可以说is!可能会更令人困惑,因为现在有一个后缀!操作符存在)。
2条答案
按热度按时间mwyxok5s1#
x !is T
不是你想的那样,如果你在代码上运行dart format
,你会发现它实际上是x! is T
;也就是说,它使用的是 post-fix!
运算符,该运算符Assertx
不是null
,然后执行正常的is T
检查(因此产生与您预期相反的结果)。如果静态地知道x
不可为空,则dart analyze
应该生成一个警告,指出不必要地使用了空Assert运算符。也许您的意思是比较
x is! T
和!(x is T)
。这两个表达式之间没有逻辑差异。有一个linter规则建议应该首选is!
,但它没有提供任何解释。我相信这是因为is!
表面上读起来更好(“is not”),并且比对括号中的表达式求反要简单(然而,这种立场早于空安全,并且可以说is!
可能会更令人困惑,因为现在有一个后缀!
操作符存在)。gojuced72#
输出:
not an integer
对于编译器,它与is !int
相同输出:
not an integer
,因为值为null
,所以不是int
启动传感器输出:
Uncaught TypeError: Cannot read properties of null (reading 'toString')Error: TypeError: Cannot read properties of null (reading 'toString')
对于编译器,它与myNum! is
相同:null safety这就像如果
myNum
是null
,抛出一个error
并且不检查。如果myNum
是not null
,则作为is
工作。结论:
这两种方法似乎都起相反的作用:if(图片!是XFile)& if(图片是!XFile)
他们应该做相反的事