Почему ключевое слово params не является контекстным? - PullRequest
6 голосов
/ 06 января 2011

Причина, по которой я спрашиваю, заключается в том, что она действительна только в объявлении параметров метода, не так ли? Я пытался создать переменную внутри тела функции под названием «params», но, конечно, это не имеет большого значения, просто интересно, почему MS решила сделать это глобальным ключевым словом, а не контекстным.

Ответы [ 4 ]

9 голосов
/ 06 января 2011

То же самое можно спросить о любом другом ключевом слове. Например, почему «класс» не является контекстным, поскольку он используется только в объявлениях классов?

Для меня ключевое слово - это ключевое слово. Я полагаю, что это значительно упрощает лексический анализ в части компиляции, так что не нужно учитывать контекст.

Кроме того, вы можете использовать символ @, чтобы позволить вам объявить переменную с именем 'params' (или любое другое зарезервированное ключевое слово):

var @params = new int[] { 1, 2 };
5 голосов
/ 06 января 2011

Ответ Тваноффсона предполагает, что было бы трудно сделать «параметры» контекстными.На самом деле это не так сложно.Рассмотрим:

void M(params x)

То, что мы бы сделали в этом случае, гипотетически, это первая попытка найти тип 'params'.Если бы мы могли найти один, отлично, мы сделали.Если мы не могли, тогда у нас есть небольшая проблема.предположим, например, вместо х это было

void M(params Int32)

Ясно, что это ошибка, но какая ошибка?Должны ли мы предполагать, что Int32 - это имя параметра и выдавать ошибку «вы пропустили тип»?Должны ли мы предполагать, что Int32 является типом, и выдавать ошибку, говорящую о том, что тип должен быть типом массива, и что вы пропускаете идентификатор?Должны ли мы дать ошибку, говоря, что нет типа с именем «params»?Что правильно делать здесь?Ясно, что мы можем что-то выяснить, но это не очевидно.

Это случаи ошибок, которые хитры с контекстными ключевыми словами;заставить работать успешные примеры на самом деле довольно просто.

Но на самом деле, не так уж и сложно сделать контекстуальный сложным , а сделать его контекстным - не очень большая победа.Создание контекстов "set" и "value" было большой победой, потому что мы предполагали, что все виды людей захотят создавать локальные переменные с именами, такими как "set" и "value".«params» - даже не английское слово, поэтому кажется менее вероятным, что кто-то захочет его использовать.Нет большой выгоды сделать его контекстным, поэтому стоимость функции неоправданна.

4 голосов
/ 06 января 2011

Эрик Липперт имеет сообщение в блоге, охватывающее контекстные и зарезервированные ключевые слова и их историю. Хотя в нем явно не объясняется, почему params находится в зарезервированном списке (он существует с версии 1.0), он подразумевает, что он принадлежит к набору зарезервированных слов, который будет сложным , чтобы сделать его контекстным.

2 голосов
/ 06 января 2011

Ключевое слово params выглядит полезным только при объявлении параметров метода, но я на самом деле согласен с MS, что было бы неплохо разрешить использовать ключевые слова для имен экземпляров, так или иначе.

Возможно, они зарезервировали возможность иметь что-то подобное в C # 8.0:

params Customers = DB.GetCustomerList();

Или иначе разрешить params также в локальной области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...