Почему я могу создать класс с именем "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, поэтому его резервирование везде могло бы нарушить обратную совместимость в некоторых программах, тогда как использование его в качестве объявления типа переменной не было бы скомпилировано в более ранних версиях, так что нет поломка.