代码之家  ›  专栏  ›  技术社区  ›  dragonfly02

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

  •  0
  • dragonfly02  · 技术社区  · 7 年前

    为什么会闯进来 Foo D2 而不是设置 d1 null ? 在.NET中,建议使用 as is 因为 铸造/转换比 测试。

    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
    }
    
    1 回复  |  直到 7 年前
        1
  •  6
  •   lrn    7 年前

    因为 as null ). 它是 类似于 作为 C#中的运算符,其计算结果为 无效的

    你的代码以 var d1 = d1OrD2 as D1; 什么时候? d1OrD2 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");
      }
    }