Why can I create a class named “var”?

2019-01-17 09:46发布

问题:

Isn't var a keyword in C#? But why can I do this:

public class var { }

public class main
{
    public static void main(string[] args)
    {
        var testVar = new var();
    }
}

The var that is used in the code is the var class that is declared before the main class. And the compiler doesn't even complain.

While when I do this:

public class int { }

or this:

public class true { }

The compiler said that int or true is a keyword and cannot be used like that. Why is it not the same with var?

回答1:

var is not a keyword according to this list.

it is a contextual keyword, so from the context the compiler is able to decide which is your class and which is the contextual keyword, and no confusion arises.

a contextual keyword is:

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

so as its not reserved you can use it.

As pointed out in the comments above there is a discussion of the differences as well as a list of the various keywords and contextual keywords added at each version of c# on Eric Lipperts blog

It is interesting to note that since the set of keywords were decided upon in C#1.0 there have been no additions, so as to preserve backwards compatibility.



回答2:

The compiler is smart enough to know that the context you are using var as a class name is never a context for the keyword so allows it (which is why it is defined as a contextual keyword).



回答3:

Another way of looking at this: "var" as a keyword was not in the first versions of C# (unlike "int" and "true"), so you might have written some code then which had a class called "var". This was perfectly fine and legal. Then later on when "var" was added to the language, the designers were so kind as to make it a keyword only in certain contexts, so your existing var class would still work.

This is one of the real challenges of language design - how to add new features without breaking existing code, and without making the new features cumbersome to use.



回答4:

In C# versions before version 3, implicitly typed local variables were not supported yet, so var had no special meaning and it was possible to define variables and classes named var. Your example program is legal, because both occurrences of var in main referred to the class var.

C# 3 and later versions are downwards compatible, so code written in C# before version 3 still compiles with the new compilers.

int and true are keywords since C# 1.



回答5:

Keywords can be reserved contextually. When the source code is parsed, that context is established as part of the parse tree. The evaluation of keywords takes place within that context. So, in this case, var isn't in a reserved context and won't have the same meaning as when you're using it in an assignment statement. I believe one reason for this flexibility is that var was introduced in C# 3, so making it reserved everywhere might have broken backwards compatibility in some programs, whereas using it as a variable type declaration wouldn't have compiled in earlier versions, so there's no breakage.



标签: c# .net-4.0