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

时间:2014-01-23 03:52:24

标签: c# dynamic var

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

class var
{

}

class dynamic
{

}

并像这样使用它们:

enter image description here

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

  

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

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

 dynamic d = new dynamic();

我收到了这个错误:

  

无法实例化动态对象。

让我们看一下var:

enter image description here

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

  

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

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

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

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

ConsoleApplication3.var

现在经过所有这些我很困惑。我想知道这里有什么区别,为什么编译器让我们创建名为vardynamic的类,它不给我任何我创建一个名为dynamic的类时出错,但如果我尝试创建动态实例,我会收到错误。但是如果我尝试创建一个var实例,它不会给我任何错误。不是那样的令人困惑?我在等待明确的解释。

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

1 个答案:

答案 0 :(得分:5)

这些被称为contextual keywords 如果您没有自己的带有这些名称的类型,它们只会表现为关键字。

这一点的目的是准确地说明你刚刚做了什么。

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

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