Dart не продвигает типовые переменные экземпляра, только локальные переменные.
Когда вы проверяете, что локальная переменная имеет определенный тип, тогда программа может использовать переменную, как если бы она имела проверенный тип. с некоторыми оговорками, потому что язык должен быть абсолютно уверен, что значение не меняется между тестом и использованием. Например, не должно быть назначений переменной в области, защищаемой тестом, и не должно быть назначений переменной, захваченной в замыкании. Поскольку переменная является локальной, компилятор может убедиться, что этого достаточно, чтобы значение переменной не изменилось.
Переменная экземпляра c
класса InferenceTest
имеет тип C1
. Существуют допустимые программы, в которых значение c
может меняться между тестом c is C2
и использованием c.s2
, и оно может быть изменено кодом из совершенно другой библиотеки, поэтому язык не осмеливается продвигать тип втот случай. Поэтому тип c
по-прежнему C1
при доступе c.s2
, и вы не можете получить доступ к s2
.
. Если вы хотите повысить, попробуйте переместить значение в локальную переменную:
var c = this.c;
if (c is C2) print(c.s2);
Это работает, что вы также видите в своем методе show2
, поскольку параметры функции являются локальными переменными и, следовательно, подвергаются продвижению типов.