Почему ограничение new () должно указываться последним? - PullRequest
7 голосов
/ 24 февраля 2011

Компилятору C # требуется, чтобы ограничение new () было указано последним.Согласно MSDN:

При использовании вместе с другими ограничениями ограничение new () должно указываться последним.

Почему существует такое ограничение?

Ответы [ 3 ]

13 голосов
/ 24 февраля 2011

Потому что так сказано в спецификации. Это, вероятно, говорит об этом, потому что это немного облегчает анализ ограничений. Нет смысла позволять вам указывать ограничения в любом порядке, и я могу представить некоторую стоимость (включая альтернативную цену!), Чтобы сделать это возможным.

Обратите внимание, что на самом деле спецификация не просто говорит о том, что у вас должно быть последнее ограничение конструктора, если оно у вас есть. Это фактически говорит о том, что вы должны иметь ограничения в следующем порядке

  1. Первичное ограничение.
  2. Вторичные ограничения.
  3. Ограничение конструктора.

Если первичное ограничение - это то, которое указывает, что параметр типа должен быть ссылочным типом или типом значения, вторичные ограничения - это те, которые задают базовый класс или интерфейсы, а ограничение конструктора - это обсуждаемое здесь ограничение.

Соответствующий раздел спецификации - §10.1.5, и его определенно стоит прочитать.

0 голосов
/ 12 июля 2011

YAQAPD: еще один вопрос о направлении синтаксического анализа

Каждый язык программирования имеет свои правила.Направление разбора является одним из них.Позвольте мне объяснить более подробно (наберитесь терпения).

Предположим, что вы пишете следующую функцию в Pascal / Delphi:

function Sum2Numbers (n1, n2:integer) : integer;
begin
   result:=n1+n2;
end;

Теперь эта же функция в C:

int function Sum2Numbers (int n1, int n2)
{
  return (n1+n2);
}

Для точки зрения программистаобе функции делают одно и то же (и действительно делают).Однако за кулисами каждый компилятор работает по-своему.

Pascal / Delphi и многие другие языки компилируют код, анализируя текст слева направо.Итак, когда мы вызываем функцию в Pascal или Delphi, компилятор помещает в стек сначала n1, а затем n2.Та же самая функция в C делает это от RIGHT TO LEFT, т.е. компиляторы помещают в стек сначала n2, а затем n1.

Оба компилятора читают параметры из стека в порядке, который они знают, поэтому все работает нормально.

Все языки "семейства C" (C, C ++, Managed C ++, C ++ / CLI, C #, ...) используют порядок синтаксического анализа кода ПРАВО НА ВЛЕВО.

Это причина, по которой ограничение new() ДОЛЖНО быть указано в ПРАВИЛЬНО В ДАЛЬНЕЙШЕМ списке ограничений.
Компилятор должен знать IN ADVANCE, что ему потребуется для создания экземпляров классов, ДО того, как их использовать.

0 голосов
/ 24 февраля 2011

Поскольку для других ограничений (например, для класса) вы можете указать конструктор, а для других ограничений - нет (Интерфейсы).

Таким образом, если сначала возникла функция new (), а затем ограничение на интерфейс, вы получили бы ошибку, потому что у вас не может быть ограничения new () для интерфейса.

...