为什么带对象的代码在与对象相同的代码工作时无法编译?

时间:2014-05-01 05:32:09

标签: c# object inheritance

在下面的2个链接中,我发现Object和object是可以互换的:

Difference between Object and object

c#: difference between "System.Object" and "object"

但我只是无法理解为什么我不能使下面的代码工作,如果对象和对象是可以互换的:

不符合“对象”的代码:

class A : Object
{
    public int x = 5;

}

class B : A
{
    static void Main()
    {
        System.Console.WriteLine(new B().x);
    }
}

输出:

  

无法找到类型或命名空间名称“Object”(您是否缺少using指令或程序集引用?)

使用“object”的代码:

class A : object
{
    public int x = 5;

}

class B : A
{
    static void Main()
    {
        System.Console.WriteLine(new B().x);
    }

}

输出:

  

5

3 个答案:

答案 0 :(得分:12)

要将Object带入范围,您需要导入System命名空间,而不是object,这是一个关键字(对象的别名)。

将此添加到您的cs文件

using System;

甚至更简单地使用完全限定名称。

class A : System.Object
{
}

答案 1 :(得分:7)

事实上,最简单的做法是不要将objectObject视为可互换。

最好将object理解为global::System.Object的别名。因此,只要您将global::System.Object视为类型名称,就可以使用object,反之亦然。

如果名称Object将被解析为类型global::System.Object(例如,因为您对using命名空间有System指令,而没有其他{{ 1}}导入不同using类型的指令),您可以改为使用Object

引用该类型的两种方式确实指的是完全相同的类型 - 生成的代码之间将存在 no 差异:

Object

global::System.Object foo = ...;

顺便提一下,C#5规范在第4.2.2节中描述了它:

  

object foo = ...; 类型
  object类类型是所有其他类型的最终基类。 C#中的每个类型都直接或间接地从对象类类型派生。

     

关键字object只是预定义类object的别名。

(在这种情况下不需要System.Object限定条件,因为规范本身没有导入名称空间的概念...... global::在规范中永远不能表示System.Object,因为例如 - 它可以在C#代码中。)

答案 2 :(得分:0)

实际上答案就在这里:

https://msdn.microsoft.com/en-us/library/9kkx3h3c(VS.71).aspx

The object data type is the type to and from which objects are boxed. 那就是说不是System.Object类型;用于装箱和拆箱使用对象。一个可能是另一个的别名,但链接和实际功能的文档让我相信它们不是可以互换的。

在评论中,有些人根据编译器错误消息做出假设“您是否缺少使用指令或汇编引用?”。

请注意,这些类都是从object和Object派生的,所以如果一个是另一个的别名,他怎么会遗漏一些东西?