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#可以做到这一点