Вопрос по c# – Почему я могу создать класс с именем «var»?

103

Isn & APOS; тvar ключевое слово в C #? Но почему я могу сделать это:

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?

у меня хороший вопрос! Richard
Прочитай это:blogs.msdn.com/b/ericlippert/archive/2009/05/11/… AakashM
Почему ты хочешь? Так запутанно и трудно читать. duffymo
Я предполагаю, что они сделали так, чтобы быть обратно совместимыми с созданием кодаbefore & Quot; вар & Quot; имел в виду что-то особенное. vidstige
Вы также можете сделатьvar var = "var"; в методе. В конце концов, это пятница. Henk Holterman

Ваш Ответ

5   ответов
8

В версиях C # до версии 3,неявно типизированные локальные переменные пока не поддерживались, поэтомуvar не имел особого значения, и было возможно определить переменные и классы с именемvar, Ваш пример программы является законным, потому что оба случаяvar вmain относится к классуvar.

C # 3 и более поздние версии совместимы снизу, поэтому код, написанный на C # до версии 3, все еще компилируется с новыми компиляторами.

int а такжеtrue являются ключевыми словами с C # 1.

12

Еще один способ взглянуть на это: «var» поскольку ключевое слово не было в первых версиях C # (в отличие от «int» и «true»), поэтому вы могли бы написать некоторый код, который имел бы класс с именем «var». Это было прекрасно и законно. Затем, когда "var" После того как язык был добавлен, дизайнеры были настолько любезны, что сделали его ключевым словом только в определенных контекстах, чтобы ваш существующий класс var продолжал работать.

Это одна из реальных проблем языкового дизайна - как добавлять новые функции, не нарушая существующий код, и не делая новые функции громоздкими в использовании.

18

Компилятор достаточно умен, чтобы знать, какой контекст вы используетеvar так как имя класса никогда не является контекстом для ключевого слова, поэтому допускает его (вот почему оно определяется какcontextual keyword).

Error: User Rate Limit ExceededvarError: User Rate Limit Exceededvar testVar = new var();Error: User Rate Limit ExceededvarError: User Rate Limit ExceedednotError: User Rate Limit Exceededvar testVarError: User Rate Limit ExceededvarError: User Rate Limit ExceededvarError: User Rate Limit ExceededvarError: User Rate Limit Exceeded
Error: User Rate Limit ExceededaddError: User Rate Limit Exceeded
3

Ключевые слова могут быть зарезервированы контекстуально. Когда исходный код анализируется, этот контекст устанавливается как часть дерева разбора. Оценка ключевых слов происходит в этом контексте. Таким образом, в этом случае var не находится в зарезервированном контексте и не будет иметь того же значения, что и при его использовании в операторе присваивания. Я полагаю, что одной из причин такой гибкости является то, что var был введен в C # 3, поэтому его резервирование везде могло бы нарушить обратную совместимость в некоторых программах, тогда как использование его в качестве объявления типа переменной не скомпилировалось бы в более ранних версиях, так что там & apos; нет поломок.

102

var это не ключевое словосогласно этому списку.

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

контекстное ключевое слово:

used to provide a specific meaning in the code, but it is not a reserved word in C#.

так как его не зарезервировано, вы можете использовать его.

Как указано в комментариях выше, здесь обсуждаются различия, а также список различных ключевых слов и контекстных ключевых слов, добавляемых в каждую версию c # on.Эрик Липпертс блог

Интересно отметить, что, поскольку в C # 1.0 был определен набор ключевых слов, не было никаких дополнений, чтобы сохранить обратную совместимость.

Error: User Rate Limit ExceededContextual Keyword. "A contextual keyword is used to provide a specific meaning in the code, but it is not a reserved word in C#. Some contextual keywords, such as partial and where, have special meanings in two or more contexts."
Error: User Rate Limit Exceededmsdn.microsoft.com/en-us/library/bb383973.aspxError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededexactlyError: User Rate Limit Exceeded
Error: User Rate Limit ExceededvarError: User Rate Limit Exceeded

Похожие вопросы