今天我发现我们可以定义一个名为var
或dynamic
的类。首先,我认为这是不可能的,因为这些是特殊的关键字,不能用作Class name.
然后我尝试了,我很惊讶。这是一个奇怪的情况,当我定义两个类:
class var
{
}
class dynamic
{
}
并像这样使用它们:
它没有给我任何错误。但是当我尝试运行我的程序时,它会出现此错误:
无法将类型字符串隐式转换为动态
但是您可能已经注意到,我的dynamic
类表现得像一个标准的C#类。当我尝试这个时:
dynamic d = new dynamic();
我收到了这个错误:
无法实例化动态对象。
让我们看一下var:
在这种情况下,var仍被评估为隐式类型定义关键字,我的变量类型推断为字符串。(注意它的颜色是绿色而不是蓝色,这是类名颜色)。但是当我运行程序时,它给了我相同的例外:
无法将类型字符串隐式转换为var
但有趣的是,当我尝试创建一个像这样的新var实例时:
var d = new var();
Console.WriteLine(d.GetType());
它没有给我任何异常,我得到了这个输出:
ConsoleApplication3.var
现在经过所有这些我很困惑。我想知道这里有什么区别,为什么编译器让我们创建名为var
和dynamic
的类,它不给我任何我创建一个名为dynamic的类时出错,但如果我尝试创建动态实例,我会收到错误。但是如果我尝试创建一个var
实例,它不会给我任何错误。不是那样的令人困惑?我在等待明确的解释。
注意:抱歉我的英语和语法错误。
答案 0 :(得分:5)
这些被称为contextual keywords 如果您没有自己的带有这些名称的类型,它们只会表现为关键字。
这一点的目的是准确地说明你刚刚做了什么。
因为这些关键字是由较新版本的C#(3.0和4.0)引入的,所以现有的代码库可能(虽然不太可能)拥有带有这些名称的类,就像你所做的那样。
因此,如果编译器看到这样的类,它将完全按照以前的方式编译,并将它们视为常规类而不是关键字。