Обратите внимание на различия между понятиями класса и объекта. Первый является типом данных, тогда как второй является его экземпляром во время выполнения, переменной. is
оператор не может сравнивать одну переменную с другой.
Согласно языковой справке
is Оператор
Оценивает, совместим ли объект с конкретным типом данных ,
класс или интерфейс . Используйте оператор is вместо instanceof
оператор для сравнения типов . Вы также можете использовать оператор is для
проверьте, реализует ли объект интерфейс.
Другими словами, компилятор ожидает, что первый операнд будет переменной , тогда как второй операнд должен быть идентификатором типа .
var sample:String = "Object is an instance of a class.";
^^^ ^^^
variable type identifier
Однако effect2
это не идентификатор типа, а переменная. Отсюда и сообщение об ошибке.
К сожалению, нет универсального оператора для проверки общности интерфейса. Единственная альтернатива:
trace((s is ISoundEffect) && (t is ISoundEffect));
Обновление
Проверить, являются ли объекты экземплярами одного и того же класса, можно путем сравнения имен классов:
if (getQualifiedClassName(effect1) == getQualifiedClassName(effect2)) {
// true
}
Подробное обсуждение см. В Получите класс, используемый для создания экземпляра объекта в AS3