Почему только статические поля могут быть объявлены как const?

Я только что обновил свой Dart Editor (0.5.16_r23799), и код, который был свободен от ошибок и предупреждений, больше не существует.

class Fubar {
  const BAR = 1000000;  
  Fubar(){   
  }
}

Линии, начинающиеся с const есть маркер и это сообщение:

Только статические поля могут быть объявлены как const

Я прочитал этот ch02-final-const, там ничего нет.

Этот пост dart-const-static-fields говорит, что const modifier implies static, если мы не можем использовать const без staticмы должны использовать final вместо этого?... но какой документ / пост я пропустил? Намерены сделать это:

Fubar f = new Fubar();
some = f.BAR;

3 ответа

Решение

Это недавнее изменение, относящееся к примечаниям, представленным 4 июня на собрании разработчиков языка Dart:

переменные экземпляра const

Гилад считает, что они должны работать как статика, за исключением определения объема. Очевидно, что это усложняет реализацию метаданных экземпляра на виртуальной машине. Три решения:

  1. Нет константных полей.
  2. Метаданные статически ограничены.
  3. Попробуйте сделать это правильно.

Ларс любит 1. Я говорю 1 упрощает вещи для пользователей. Прямо сейчас, люди путаются со статической финальной константой и т. Д. Гилад в порядке с 1.

Я спросил, будет ли синтаксис статическим константным или просто константным? Пользователи путаются, когда им приходится делать "статические" с константами.

Ларс говорит, что они сбиты с толку, потому что они не понимают систему. Требование "статики" поможет им понять, что происходит.

Причина, по которой вы не можете использоватьconstс полями класса, потому что постоянное поле создается во время компиляции, поле принадлежит экземпляру класса (пока вы явно не добавили ключевое слово static) и создается во время выполнения. Вы не можете создать поле до экземпляра, которому оно принадлежит. И поэтому поле нельзя сделать постоянным. Хотя статическое поле можно сделать постоянным, поскольку статические поля связаны с классом и с классами; во время компиляции компилятор Dart анализирует определения классов и генерирует соответствующие метаданные и инструкции. Это означает, что статическое поле (как часть определений классов) может быть постоянным (неизменяемым) во время компиляции. Таким образом, во время выполнения уже известно, что это конкретное поле класса является константой.

пытаться static const BAR = 1000000

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