为什么我可以创建一个名为"var"的类?

Joh*_*ona 103 c# .net-4.0

不是varC#中的关键字?但为什么我这样做:

public class var { }

public class main
{
    public static void main(string[] args)
    {
        var testVar = new var();
    }
}
Run Code Online (Sandbox Code Playgroud)

var是在代码中使用的是var这是在之前声明的类main类.编译器甚至没有抱怨.

当我这样做时:

public class int { }
Run Code Online (Sandbox Code Playgroud)

或这个:

public class true { }
Run Code Online (Sandbox Code Playgroud)

编译器说int或者true是关键字,不能像那样使用.为什么不一样var

Sam*_*der 101

var根据此列表不是关键字.

它是一个上下文关键字,因此从上下文中,编译器能够决定哪个是您的类,哪个是上下文关键字,并且不会产生混淆.

上下文关键字是:

用于在代码中提供特定含义,但它不是C#中的保留字.

所以它没有保留,你可以使用它.

正如上面的评论中所指出的那样,在Eric Lipperts博客上讨论了差异以及在每个c#版本中添加的各种关键字和上下文关键字的列表

值得注意的是,由于在C#1.0中确定了关键字集,因此没有添加,以便保持向后兼容性.

  • @TimSchmelter然后"var"是一个"关键字".只是不是一个"保留字",对吧? (5认同)
  • 但它是一个[`Contextual Keyword`](http://msdn.microsoft.com/en-us/library/x53a06bb.aspx)._"上下文关键字用于在代码中提供特定含义,但它不是C#**中的保留字.某些上下文关键字,例如partial和where,在两个或多个上下文中具有特殊含义." _ (4认同)
  • 我猜这是为了保持与旧代码的兼容性 - 如果有人有一个名为`var`的类,那么在升级C#时并不是所有内容都会中断. (2认同)

Ode*_*ded 18

编译器足够聪明,知道您var作为类名使用的上下文绝不是关键字的上下文,因此允许它(这就是为什么它被定义为上下文关键字).


Pol*_*fun 12

另一种看待这种情况的方式:作为关键字的"var"不在C#的第一个版本中(与"int"和"true"不同),所以你可能编写了一些代码,其中有一个名为"var"的类.这非常好,合法.然后,当"var"被添加到语言中时,设计师非常善良,只能在某些上下文中使其成为关键字,因此您现有的var类仍然可以工作.

这是语言设计的真正挑战之一 - 如何在不破坏现有代码的情况下添加新功能,并且不会使新功能使用起来很麻烦.


dtb*_*dtb 8

在版本3之前的C#版本中,尚不支持隐式类型的局部变量,因此var没有特殊含义,可以定义名为的变量和类var.您的示例程序是合法的,因为两次出现都是varmain引用该类时var.

C#3及更高版本向下兼容,因此在版本3之前用C#编写的代码仍然可以编译新的编译器.

int并且true是C#1以来的关键词.