Дарт: Почему следующий код компилируется в усиленном режиме?

void main(){
  new C(new A()); // This gives no warning or error
  new D(new A()); // This gives an error

}
class A{}

class B extends A{}

class C {
  B b;
  C(A bb){    this.b = bb;   }
}

class D {  
  B b; 
  D(this.b); 
}

В обоих операторах основной функции я указываю в качестве параметра экземпляр типа A. Если я не ошибаюсь, оба оператора должны выдавать ошибку или предупреждение в строгом режиме, однако только второй выдает ошибку: Ошибка проверки типа: новое A () (A) не относится к типу B

http://i.stack.imgur.com/pcipz.png

Я только начал изучать язык дротиков и не смог найти в документации объяснения этого случая. Кто-нибудь знает, почему это происходит?


person Zacharias Georgiou    schedule 16.06.2016    source источник


Ответы (1)


Похоже, вы допустили опечатку в конструкторе C. Ты имеешь ввиду:

class C {
  B b;
  C(B/*not A*/ bb){    this.b = bb;   }
}
person Alexandre Ardhuin    schedule 16.06.2016
comment
Нет, на самом деле сообщение об ошибке должно быть в этой строке: this.b = bb;, потому что тип b - B, а bb - A. Думаю, я нашел ответ здесь :. Поскольку понижающие назначения могут быть допустимыми, а Дарт оптимистично полагает, что вы знаете, что делаете, мы заставляем их также проходить статическую проверку. То, что я делаю, - это понижающее назначение. https://www.dartlang.org/articles/why-dart-types/ Спасибо за быстрый ответ! - person Zacharias Georgiou; 16.06.2016
comment
Вот и все. Это неявное отрицание. Возникла проблема с добавить флаг, чтобы отключить его - person Alexandre Ardhuin; 16.06.2016