If statement 如何在Dart中访问案例中的开关参数
我想打开动物的开关并采取适当的行动If statement 如何在Dart中访问案例中的开关参数,if-statement,types,dart,flutter,switch-statement,If Statement,Types,Dart,Flutter,Switch Statement,我想打开动物的开关并采取适当的行动 switch (animal.runtimeType) { case Cat: animal.pet(); break; case Crocodile: animal.runAway(); break; default: print('Not a known animal.'); } 如果我是If链接,这将起作用,因为作用域将知道If(animal is Cat){}块中animal的类型 由于某些原因,
switch (animal.runtimeType) {
case Cat:
animal.pet();
break;
case Crocodile:
animal.runAway();
break;
default:
print('Not a known animal.');
}
如果我是If链接,这将起作用,因为作用域将知道If(animal is Cat){}
块中animal
的类型
由于某些原因,switch语句的情况并非如此。
在这种情况下,我将得到错误
没有为类animal定义方法pet()
如何在case块中使用case断言?
我不能将
用作
,因为我的CI Lint不允许这样做(这是一件好事),而且在案例中使用If操作没有任何意义,因为使用If-else语句将减少代码量并提供更多可用性。我不确定我是否理解您的问题,或者您不理解问题
假设您在Cat
内部定义了方法pet()
,但没有在Animal
内部定义,则不会为类Animal定义方法pet(),因为Animal
是泛型的。动物
不一定是猫
,因此不能为动物
调用方法pet()
,因为它只在猫
中定义
如果
animal
是一个局部变量,则在case块中进行强制转换是完全安全的。您可以可靠地执行(动物如猫).pet()
,一旦您刚刚检查了动物
确实是猫
,那么为什么要在if块中不需要相同的动物
的情况下,需要在机箱内部对猫
进行打字呢?编译器应该知道动物在任何给定情况下的状态,并且不需要再次检查。除非if case的范围是局部的(值不能更改),而switch case是全局的(值可能在块返回之前更改)。@JoelBroström关于这一点,我很难遵循您的示例。无论我将animal
设置为Cat
还是仅设置为animal
,它都会使开关失效并进入默认状态:我在这里做错了什么吗?如果是这样的话,更新的示例将非常有助于理解您的问题。@JoelBroström因为这些是不同的用法。您的开关与if(animal is Cat){}
不同,它与if(animal.runtimeType==Cat){}
相同。Dart只能在您使用is
@HugoPassos时自动播放,而我不能在交换机中使用is
,因为它只处理=
比较?来自Kotlin的When语句seam在各个方面都是对Dart switch语句的改进。我错了吗?@JoshuaWade我应该说这只是用来说明我问题的伪代码。基本上,我想了解的是switch和if语句的范围如何不同,或者我如何在switch中获得与if-else链中相同的行为。我感觉到你的痛苦,C#可以做到这一点