【问题标题】:Why that is possible to define a class named var or dynamic?为什么可以定义一个名为 var 或 dynamic 的类?
【发布时间】:2014-01-23 03:52:23
【问题描述】:

今天我注意到我们可以定义一个名为vardynamic 的类。首先,我认为这是不可能的,因为这些是特殊关键字,不能用作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

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

注意:对于我糟糕的英语和语法错误,我深表歉意。

【问题讨论】:

    标签: c# dynamic var


    【解决方案1】:

    这些被称为contextual keywords
    只有当您没有自己的类型具有这些名称时,它们才会充当关键字。

    这样做的目的是完全允许您刚刚所做的事情。

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

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

    【讨论】:

    • 我明白了。但据我所知,动态关键字添加在var关键字之后。为什么我可以创建var实例,但我不能创建dynamic实例?
    • @Selman22:这对我来说很好;你一定是做错了什么。
    • 你在哪里声明了类?请包含完整的源文件(例如,gist.github.com
    猜你喜欢
    • 1970-01-01
    • 2019-07-12
    • 2014-01-06
    • 2016-08-31
    • 2021-09-29
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多