为什么可以定义名为var或dynamic的类?

Sel*_*enç 1 c# var dynamic

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

class var
{

}

class dynamic
{

}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它们:

在此输入图像描述

它没有给我任何错误.但是当我尝试运行我的程序时它会出现这个错误:

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

但是您可能已经注意到,我的dynamic课程表现得像一个标准的C#课.当我尝试这个时:

 dynamic d = new dynamic();
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

无法实例化动态对象.

我们来看看吧 var:

在此输入图像描述

在这种情况下,var仍被评估为隐式类型定义关键字,我的变量类型推断为字符串.(注意它的颜色是绿色而不是蓝色,这是类名颜色).但是当我运行程序时,它给了我相同的异常:

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

但有趣的是,当我尝试创建一个像这样的新var实例时:

var d = new var();
Console.WriteLine(d.GetType());
Run Code Online (Sandbox Code Playgroud)

它没有给我任何异常,我得到这个输出:

ConsoleApplication3.var
Run Code Online (Sandbox Code Playgroud)

现在毕竟这些我confused.I'm想知道是什么样的区别就在这里,为什么编译器让我们创建一个名为类vardynamic,它不给我,当我创建一个类名为动态任何错误,但如果我尝试创建动态的实例我收到了一个错误.但是如果我尝试创建一个var实例,它不会给我任何错误.这不是那么令人困惑吗?我在等待清楚的解释.

注意:抱歉我的英语和语法错误.

SLa*_*aks 5

这些称为上下文关键字.
如果您没有自己的带有这些名称的类型,它们只会表现为关键字.

这一点就是准确地允许你刚刚做了什么.

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

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