Могу ли я сказать вар является типа, или я должен сказать, что переменная является ключевое слово что указывает компилятору, чтобы определить тип?
Это зависит от того, как вы на это смотрите. Шутки в сторону!
Компилятор C# выполняет три вида анализа программ, каждый последующий анализ потребляет результат предыдущего. Первый вид анализа, который мы делаем, - лексический анализ; мы берем текст и превращаем его в ряд жетонов. Предположим, у вас есть
class C { static void Main(){ var x = 123; } }
Сначала определить, что эти маркеры являются идентификатор класса (C) LEFTBRACE STATIC VOID IDENTIFIER (Main) LEFTPAREN RIGHTPAREN LEFTBRACE IDENTIFIERTHATMIGHTBEAKEYWORD (вар) IDENTIFIER (х) РАВНО INTEGER (123) SEMICOLON RIGHTBRACE RIGHTBRACE.
На этом этапе анализа «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» к типу или используется как ключевое слово. Для этого требуется семантический анализ.
Когда мы выполняем семантический анализ дерева синтаксического разбора, мы говорим «ОК, есть класс C, у него есть метод Main, который объявляет локальную переменную x. Каков тип этой локальной переменной?»
На данный момент есть две возможности. Первая возможность заключается в том, что в глобальном пространстве имен есть класс, структура, перечисление, интерфейс или тип делегата с именем «var». (В этом фрагменте программы нет «использования» директив, поэтому нам не нужно проверять какие-либо другие пространства имен, а тип не является частичным, поэтому нам не нужно проверять какие-либо другие объявления типа). Мы ищем глобальное пространство имен всех ссылочных ассемблеров, которые ищут тип, называемый «var». Мы также выполняем семантический анализ объявлений типов во всех других файлах, опять же, ищем тип, называемый var.
Если мы найдем один, то «var» относится к этому типу.
Если мы его не найдем, мы предполагаем, что «var» используется как контекстное ключевое слово, которое вводит неявно типизированное локальное.
Таким образом, чтобы ответить на ваш вопрос:
лексический кода фрагмент «вар» является лексемой идентификатора с отметкой о нем говорится, что «кстати, это может быть на самом деле ключевым словом».
грамматической, маркер «вар» тип , когда он появляется в месте, в грамматике, где тип ожидается.
семантический, синтаксис типа «переменный» является типом , когда существует тип в области видимости называется переменной; если такого типа нет, а «var» используется как тип локального объявления, тогда синтаксис типа «var» не относится к типу. Скорее, это инструкция для компилятора вывести фактический тип локального.
и можете ли вы объяснить мне, что означает «неявный тип var» в статье msdn, как я цитировал? Бит, потерянный в переводе здесь;) Слишком отредактированный вопрос, вы, где слишком быстро ... –
@Caspar: Это означает, что вы можете использовать 'var' для объявления типа переменной, и в этом случае тип времени компиляции переменной является типом выражения в правой части. –
Важно не потерять форматирование, это «неявный тип ** var **». Var является неявной типизацией в том, что фактический тип определяется компилятором из того, что ему назначено, то есть 'var i = 10;', в отличие от явно типизированной переменной, то есть 'int i = 10;' Implicit действительно означает подразумеваемый или предполагаемый тип. Это помогает? – Lazarus