Почему переопределение отрицания вызывает статическое предупреждение в Dart

Наличие простого следующего класса считается статическим предупреждением. Почему?

оператор 'отрицание' должен возвращать числовой тип


class Vector {
      final int x,y;
      const Vector(this.x, this.y);

      Vector operator +(Vector v) { // Overrides + (a + b).
        return new Vector(x + v.x, y + v.y);
      }

      Vector operator -(Vector v) { // Overrides - (a - b).
        return new Vector(x - v.x, y - v.y);
      }

      Vector operator negate() {    // Overrides unary negation (-a).
        return new Vector(-x,-y);
      }

      String toString() => '($x,$y)';
    }

    main() {
      final v = new Vector(2,3);
      final w = new Vector(2,2);
      assert((-v).x == -2 && (-v).y == -3); // -v  == (-2,-3)
    }

2 ответа

Решение

У нас есть открытая ошибка для этого: http://code.google.com/p/dart/issues/detail?id=3416

Начиная с 21.08.2012 раздел 7.1.2 " Спецификация дротиков" рассматривает определение отрицания с возможным нулевым типом как плохой стиль и должен сообщать пользователю статическое предупреждение.

Определение нулевого метода с именем negate или двоичного метода с именем equals будет иметь тот же эффект, что и определение оператора, но считается плохим стилем и вызовет статическое предупреждение.

[...]

Это статическое предупреждение, если возвращаемый тип объявленного пользователем оператора []= объявлен явно, а не void. Это статическое предупреждение, если возвращаемый тип объявленного пользователем оператора equals явно объявлен и не является bool. Это статическое предупреждение, если возвращаемый тип объявленного пользователем оператора отрицания явно объявлен, а не числовой тип.

Другие вопросы по тегам