C# 为什么可以定义一个名为var或dynamic的类?

C# 为什么可以定义一个名为var或dynamic的类?,c#,dynamic,var,C#,Dynamic,Var,今天我注意到我们可以定义一个名为var或dynamic的类。首先,我认为这是不可能的,因为这些是特殊的关键字,不能用作类名。,但后来我尝试了,我很惊讶。当我定义两个类时,出现了一种奇怪的情况: class var { } class dynamic { } 然后像这样使用它们: var d = new var(); Console.WriteLine(d.GetType()); 它不会给我任何错误。但当我尝试运行我的程序时,它会给出以下错误: 无法将类型字符串隐式转换为动态字符串 但

今天我注意到我们可以定义一个名为
var
dynamic
的类。首先,我认为这是不可能的,因为这些是特殊的关键字,不能用作
类名。
,但后来我尝试了,我很惊讶。当我定义两个类时,出现了一种奇怪的情况:

class var
{

}

class dynamic
{

}
然后像这样使用它们:

var d = new var();
Console.WriteLine(d.GetType());

它不会给我任何错误。但当我尝试运行我的程序时,它会给出以下错误:

无法将类型字符串隐式转换为动态字符串

但正如您可能已经注意到的,我的
动态
类的行为类似于标准C#类

 dynamic d = new dynamic();
我得到了这个错误:

无法实例化动态对象

让我们看看
var:

在本例中,var仍然作为隐式类型定义关键字进行计算,而我的变量类型推断为字符串。(注意,它的颜色是绿色而不是蓝色,这是类名颜色)。但当我运行程序时,它给了我相同的异常:

无法将类型字符串隐式转换为变量

但有趣的是,当我尝试创建一个新的var实例时,如下所示:

var d = new var();
Console.WriteLine(d.GetType());
它没有给我任何异常,我得到以下输出:

ConsoleApplication3.var
现在,在所有这些之后,我感到困惑。我想知道这里的区别是什么,为什么编译器让我们创建名为
var
dynamic
的类,当我创建名为dynamic的类时,它不会给我任何错误,但是如果我尝试创建dynamic的实例,我会得到一个错误。但是如果我尝试创建
var
实例,它不会给我任何错误。这是不是很混乱?我在等清楚的解释

注:对不起,我的英语和语法错误不好

这些被称为。
如果您没有自己的具有这些名称的类型,则它们只能充当关键字

这一点是为了让你所做的一切都能实现

因为这些关键字是由较新版本的C#(3.0和4.0)引入的,所以一些现有的代码库可能(尽管不太可能)有具有这些名称的类,就像您所做的那样

因此,如果编译器看到这些类,它将完全按照以前的方式编译,并将它们视为常规类而不是关键字。

这些类被称为。
如果您没有自己的具有这些名称的类型,则它们只能充当关键字

这一点是为了让你所做的一切都能实现

因为这些关键字是由较新版本的C#(3.0和4.0)引入的,所以一些现有的代码库可能(尽管不太可能)有具有这些名称的类,就像您所做的那样


因此,如果编译器看到这样的类,它将完全按照以前的方式编译,并将它们视为常规类而不是关键字。

我理解。但据我所知,在var关键字之后添加了dynamic关键字。为什么我可以创建
var
实例,但是我不能创建一个
动态
实例?@Selman22:这对我来说很好;你一定做错了什么事。你在哪里申报的?请包括我理解的完整源文件(例如,on)。但据我所知,在var关键字之后添加了dynamic关键字。为什么我可以创建
var
实例,但我不能创建
dynamic
实例?@Selman22:这对我来说很好;你一定做错了什么事。你在哪里申报的?请包括完整的源文件(例如,on)