Почему я могу создать класс с именем "var"?
Не var
ключевое слово в С#? Но почему я могу это сделать:
public class var { }
public class main
{
public static void main(string[] args)
{
var testVar = new var();
}
}
var
, который используется в коде, является классом var
, который объявляется перед классом main
. И компилятор даже не жалуется.
Пока я это делаю:
public class int { }
или это:
public class true { }
Компилятор сказал, что int
или true
является ключевым словом и не может использоваться как это. Почему это не то же самое с var
?
Ответы
Ответ 1
var
не является ключевым словом в соответствии с этим списком.
это контекстуальное ключевое слово, поэтому из контекста компилятор может решить, каков ваш класс и каково контекстуальное ключевое слово, и не возникает путаницы.
контекстное ключевое слово:
используется для предоставления определенного значения в коде, но это не зарезервированное слово в С#.
так как он не зарезервирован, вы можете его использовать.
Как указано в приведенных выше замечаниях, обсуждается различия, а также список различных ключевых слов и контекстных ключевых слов, добавленных в каждой версии С# на Блог Eric Lipperts
Интересно отметить, что, поскольку набор ключевых слов был определен в С# 1.0, никаких дополнений не было, чтобы сохранить обратную совместимость.
Ответ 2
Компилятор достаточно умен, чтобы знать, что контекст, который вы используете var
в качестве имени класса, никогда не является контекстом для ключевого слова, поэтому позволяет его (поэтому он определяется как контекстное ключевое слово).
Ответ 3
Еще один способ взглянуть на это: "var" в качестве ключевого слова не было в первых версиях С# (в отличие от "int" и "true" ), поэтому вы могли бы написать код, который имел класс с именем "var". Это было прекрасно и законно. Затем, позже, когда к языку был добавлен "var", дизайнеры были настолько добры, что сделали его ключевым словом только в определенных контекстах, поэтому ваш существующий класс var все равно будет работать.
Это одна из реальных проблем дизайна языка - как добавить новые функции, не нарушая существующий код, и не делая новые функции громоздкими.
Ответ 4
В версиях С# до версии 3 неявно введенные локальные переменные еще не поддерживались, поэтому var
не имел особого значения, и это было возможно для определения переменных и классов с именем var
. Ваша примерная программа легальна, поскольку оба вхождения var
в main
относятся к классу var
.
С# 3 и более поздние версии совместимы, поэтому код, написанный на С# до версии 3, все еще компилируется с новыми компиляторами.
int
и true
являются ключевыми словами с С# 1.
Ответ 5
Ключевые слова могут быть зарезервированы контекстно. Когда исходный код анализируется, этот контекст устанавливается как часть дерева синтаксического анализа. Оценка ключевых слов происходит в этом контексте. Таким образом, в этом случае var не находится в зарезервированном контексте и не будет иметь то же значение, что и при использовании его в инструкции присваивания. Я полагаю, что одна из причин такой гибкости заключается в том, что var был введен в С# 3, поэтому его резервирование везде могло бы нарушить обратную совместимость в некоторых программах, тогда как использование его в качестве объявления типа переменной не было бы скомпилировано в более ранних версиях, так что нет поломка.