Dart中的is!和!有什么区别?

zzoitvuj  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(300)

我想看看一个变量是否不属于某个类型,我知道我可以做if(picture is XFile),但是这两种方法似乎都起相反的作用:
if(picture !is XFile)
if(picture is! XFile)
有什么区别吗?

mwyxok5s

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!可能会更令人困惑,因为现在有一个后缀!操作符存在)。

gojuced7

gojuced72#

void main() {
  var myNum = 5;

  if (myNum is! int) {
    print('myNum is an integer');
  }else{
    print('not an integer');
  }
}

输出:not an integer对于编译器,它与is !int相同

void main() {
  var myNum = null;

  if (myNum is int) {
    print('myNum is an integer');
  }else{
    print('not an integer');
  }
}

输出:not an integer,因为值为null,所以不是int启动传感器

void main() {
  var myNum = null;

  if (myNum !is int) {
    print('myNum is an integer');
  }else{
    print('not an integer');
  }
}

输出:Uncaught TypeError: Cannot read properties of null (reading 'toString')Error: TypeError: Cannot read properties of null (reading 'toString')对于编译器,它与myNum! is相同:null safety
这就像如果myNumnull,抛出一个error并且不检查。如果myNumnot null,则作为is工作。

结论

这两种方法似乎都起相反的作用:if(图片!是XFile)& if(图片是!XFile)
他们应该做相反的事

相关问题