Могу ли я сказать, что var - это тип , или я должен сказать, что var - это ключевое слово , которое указывает компилятору определить тип?
Это зависит от того, как вы на это смотрите.Серьезно!
Компилятор C # выполняет три вида анализа программ, каждый последующий анализ использует результат предыдущего.Первый вид анализа, который мы делаем, это лексический анализ;мы берем текст и превращаем его в серию токенов.Предположим, у вас есть
class C { static void Main(){ var x = 123; } }
Сначала мы определим, что эти токены являются ИДЕНТИФИКАТОРОМ КЛАССА (C) ИДЕНТИФИКАТОР СТАТИЧЕСКОГО ВИДА ЛЕВЫХ КЛАВИШ (Основной) ЛЕВЫЙ ПРЯМОЙ ПАРТЫ ЛЕВЫЙ КЛАВИШ ИДЕНТИФИЦИРУЮЩЕЙ ПЛОСКОЙ КЛАВИШИ (var) ИДЕНТИФИКАЦИОННЫЙ ПРАВО (правый) ПРАВОСЛУЖИВАНИЕ (var) ИДЕНТИФИКАЦИОННЫЙ ПРАВО (правая точка) (x).
На данном этапе анализа «var» - это идентификатор с пометкой, в котором говорится, что это может быть ключевое слово var, а не идентификатор var.
Следующий анализ, который мы проводимэто грамматический анализ, в котором токены организованы в группы, которые образуют "дерево разбора".В этом случае токены будут организованы в это дерево (отступ указывает на уровень вложенности в дереве)
declaration of class: CLASS
class name: IDENTIFIER(C)
class body begins: LEFTBRACE
declaration of method:
method modifier: STATIC
return type: VOID
method name: IDENTIFIER(Main)
formal parameter declarations:
formal parameter declarations begin: LEFTPAREN
formal parameter declarations end: RIGHTPAREN
method body:
method body begins: LEFTBRACE
local declaration statement:
type: IDENTIFIERTHATMIGHTBEAKEYWORD(var)
local name: IDENTIFIER(x)
initializer:
assignment operator: EQUALS
integer literal expression: INTEGER(123)
statement ends: SEMICOLON
method body ends: RIGHTBRACE
class body ends: RIGHTBRACE
В этот момент var классифицируется как тип, грамматически .В том месте, где мы ожидаем объявление типа, если это грамматически легальная программа.
Но на данный момент мы не знаем, относится ли «var» к типу или используется в качестве ключевого слова.Это требует семантического анализа.
Когда мы выполняем семантический анализ дерева разбора, мы говорим: «ОК, есть класс C, у него есть метод Main, который объявляет локальную переменную x.Какой тип этой локальной переменной? "
На данный момент есть две возможности.Первая возможность заключается в том, что в глобальном пространстве имен есть класс, структура, перечисление, интерфейс или тип делегата с именем «var».(В этом фрагменте программы нет директив «using», поэтому нам не нужно проверять какие-либо другие пространства имен, а тип не является частичным, поэтому нам не нужно проверять любые другие объявления типов).Мы ищем глобальное пространство имен всех ссылочных сборок, ища тип с именем «var».Мы также выполняем семантический анализ объявлений типов во всех других файлах, опять же, ища тип с именем var.
Если мы найдем его, тогда «var» относится к этому типу.
Еслимы не находим его, тогда мы предполагаем, что «var» используется как контекстное ключевое слово, которое вводит неявно типизированный local.
Итак, чтобы ответить на ваш вопрос:
Лексически , фрагмент кода "var" является идентификатором токена с примечанием на нем, которое говорит "кстати, этона самом деле это может быть ключевое слово ".
Грамматически , токен" var "имеет тип , когда он появляется в позиции в грамматике, где ожидается тип .
Семантически , синтаксис типа "var" является типом , когда в области видимости есть тип, называемый var ;если такого типа нет и «var» используется в качестве типа локального объявления, то синтаксис типа «var» не относится к типу.Скорее, это инструкция для компилятора для вывода фактического типа локального.