Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我可以创建一个名为“quot;var";?_C#_.net 4.0 - Fatal编程技术网

C# 为什么我可以创建一个名为“quot;var";?

C# 为什么我可以创建一个名为“quot;var";?,c#,.net-4.0,C#,.net 4.0,varC#中的关键字不是吗?但我为什么可以这样做: public class var { } public class main { public static void main(string[] args) { var testVar = new var(); } } public class int { } 代码中使用的var是在main类之前声明的var类。编译器甚至没有抱怨 当我这样做的时候: public class var { } p

var
C#中的关键字不是吗?但我为什么可以这样做:

public class var { }

public class main
{
    public static void main(string[] args)
    {
        var testVar = new var();
    }
}
public class int { }
代码中使用的
var
是在
main
类之前声明的
var
类。编译器甚至没有抱怨

当我这样做的时候:

public class var { }

public class main
{
    public static void main(string[] args)
    {
        var testVar = new var();
    }
}
public class int { }
或者这个:

public class true { }

编译器说
int
true
是一个关键字,不能这样使用。为什么与
var
不一样?

var
不是一个关键字

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

上下文关键字是:

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

因为它不是保留的,所以你可以使用它

正如上面的评论所指出的,我们讨论了不同之处,并列出了在c#on的每个版本中添加的各种关键字和上下文关键字


有趣的是,由于关键字集是在C#1.0中确定的,因此没有添加任何内容,以保持向后兼容性。

编译器足够聪明,知道您使用的
var
作为类名的上下文从来都不是关键字的上下文,因此允许它(这就是为什么它被定义为a)在第3版之前的C版本中,

还不受支持,因此
var
没有特殊意义,可以定义名为
var
的变量和类。您的示例程序是合法的,因为
main
中出现的
var
都引用了类
var

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


int
true
是自C#1以来的关键字。

另一种看待这一点的方式:“var”作为关键字不在C#的第一个版本中(与“int”和“true”不同),因此您可能编写了一些代码,其中包含一个名为“var”的类。这是完全合法的。后来,当“var”被添加到语言中时,设计者非常友好,只在某些上下文中将其作为关键字,因此您现有的var类仍然可以工作


这是语言设计的真正挑战之一——如何在不破坏现有代码的情况下添加新功能,同时又不使新功能的使用变得繁琐。

关键字可以在上下文中保留。解析源代码时,该上下文将作为解析树的一部分建立。关键字的评估在该上下文中进行。因此,在本例中,var不在保留上下文中,并且不会与在赋值语句中使用它时具有相同的含义。我认为这种灵活性的一个原因是var是在C#3中引入的,因此在某些程序中保留它可能会破坏向后兼容性,而使用它作为变量类型声明在早期版本中不会编译,因此不会有任何破坏。

为什么要这样做?如此令人困惑和难以阅读。请阅读以下内容:这是一个很好的问题!您还可以执行
var=“var”。毕竟,今天是星期五。我猜他们这样做是为了在“var”有任何特殊含义之前向后兼容代码创建。但是在这里它被分类在“C#Keywords”下。。。令人困惑但这是一个错误。“上下文关键字用于在代码中提供特定含义,但在C#中它不是保留字。某些上下文关键字,如partial和where,在两个或多个上下文中具有特殊含义。”@TimSchmelter Then“var”是一个“关键字”。只是不是一个“保留字”,对吧?我猜这是为了保持与旧代码的兼容性-如果有人有一个名为
var
的类,那么在升级C#时,并不是所有的东西都会坏掉。@CallumRogers:这正是C#团队这样做的原因。其他后来引入的“关键字”如from、join等也是如此(顺便说一句,都是上下文的)。我认为这个答案至少有点误导。编译器不太“聪明”,无法确定
var
是否被用作代码中的关键字,如
var testVar=new var()。是的,上下文(就是否定义了名为
var
的自定义类型而言)起作用,但正是因为编译器在这些情况下不够聪明,无法知道
var testVar
是引用类
var
还是引用关键字
var
,所以它在这样的上下文中默认为类。如果
var
关键字的名称不同,它可以在完全相同的“上下文”中使用。与其他上下文关键字相比,例如
add
——在这里,编译器确实在每次出现时都知道关键字的意思(事件声明;标识符在这里没有任何意义),或者代码是否引用标识符(声明中的类型或名称,在方法体中使用标识符;关键字在这里没有任何意义)。