【问题标题】:Dart - if statement executing even if the condition is falseDart - 即使条件为假也会执行 if 语句
【发布时间】:2020-04-10 04:57:05
【问题描述】:

我刚开始学习 Dart,在做练习时卡住了。程序正在执行 'if' 语句,即使它是假的。代码如下。

void main() {
var x = 'hello';

  if (x is int) {
   int y = 0;
   y = x % 2;
   print("Integer");
   switch (y) {
     case 0:
      print("Even");
      break;

     case 1:
      print("Odd");
      break;

     default:
      print("Unknown");
    }
  } 

 else if (x is double) {
  print("Decimal");
  } 

 else {
  print("String");
  }
}

控制台显示的错误是:

错误:没有为类“String”定义方法“%”。 尝试将名称更正为现有方法的名称,或定义名为“%”的方法。 y = x%2; ^

它适用于任何整数,但不适用于字符串或十进制值。

虽然如果我这样做,代码对所有值(整数、字符串和小数)都非常有效。

void main() {
var x = 'hello';

if (x is int) {
 print("Integer");
 } 

else if (x is double) {
 print("Decimal");
 } 

else {
 print("String");
 }
}

请帮忙。 谢谢

【问题讨论】:

  • 替换“y = x % 2;”用“y = int.parse(x) % 2;”

标签: dart


【解决方案1】:

此错误是在编译期间发出的,而不是在运行时发出的。 x is int 永远不是真的没关系。这类似于以下代码:

if (false) {
  this is a syntax error
}

你仍然会期待编译错误。

在这种情况下,Dart 编译器已经知道 xString 类型(通过类型推断)并且 % 没有在该类型上定义。 (可以说,由于编译器知道条件始终为假,它可以忽略整个 if 块。您也可以争辩说更早报告错误更好,这就是 Dart 编译器在这里所​​做的。)

如果您将x 的类型更改为显式设置为dynamicObject,那么您的代码将编译,您将获得您所期望的运行时行为。

【讨论】:

  • 使 x 动态工作。动态 x = '你好';非常感谢您的快速响应。谢谢 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多