在 dart 中使用“as”进行类型转换

stt*_*106 3 dart

为什么它在突破Foo传球的实例时D2,而不是设置d1null?在 .NET 中,建议使用as而不是is因为is通常需要两次转换/转换,这比null测试更昂贵。

class Base {}
class D1 extends Base{}
class D2 extends Base{}

void Foo(Base d1OrD2) {
  var d1 = d1OrD2 as D1;
  if (d1 != null) print("it's d1");
  else {
    var d2 = d1OrD2 as D2;
    if (d2 != null) print("it's d2");
  }
}


void main() async{
  Foo(D2()); // throws exception D2 is not an instance of D1.
  Foo(D1()); // works
}
Run Code Online (Sandbox Code Playgroud)

lrn*_*lrn 9

因为asDart 中的运算符在对象不是右侧类型(或null)的实例时抛出。这是不是类似as在C#运营商将计算得到null的,而不是抛出。

您的代码以var d1 = d1OrD2 as D1;Whend1OrD2是一个D2实例开始,该操作将引发。

你应该做的是:

void Foo(Base d1OrD2) {
  if (d1OrD2 is D1) {
    // Static type of d1OrD2 is D1 here, you can call D1 methods on it.
    print("it's d1");
  } else {
    var d2 = d1OrD2 as D2;
    print("it's d2");
  }
}
Run Code Online (Sandbox Code Playgroud)