【问题标题】:Why code with Object fails to complile when the same code with object works?为什么当与对象相同的代码工作时,与对象的代码无法编译?
【发布时间】:2014-05-01 05:32:08
【问题描述】:

在下面的 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 指令或程序集引用?)

使用“对象”的代码:

class A : object
{
    public int x = 5;

}

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

}

输出:

5

【问题讨论】:

  • 仅供参考——一切都自动源自Object
  • 问题的答案就在你的问题中。 are you missing a using directive or an assembly reference? 请在此处提问之前阅读并理解编译器输出。没那么难。
  • 您缺少 using 指令或命名空间前缀。
  • 如果 Object 和 object 可以互换,那么这意味着 object 是 System.Object 的别名......那为什么我需要使用“使用 System”作为命名空间

标签: c# object inheritance


【解决方案1】:

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

将此添加到您的 cs 文件中

using System;

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

class A : System.Object
{
}

【讨论】:

  • 如果 Object 和 object 可以互换,那么这意味着 object is an alias for System.Object... 那我为什么需要使用 "using System" as namespace
  • @KumarVivekMitra:否则编译器不知道名称 Object 的含义 - 它可能意味着 SomeOtherNamespace.Object。编译器有object的特殊知识,但没有Object
  • @JonSkeet,先生,当我问这个问题时,您刚刚说了我的预期,但我只想澄清object is kinda primitive thing and Object an reference type。是的,我确实知道“对象”或“对象”只是引用类型......但是如果编译器有特殊的方式来处理没有其命名空间的对象,那么它是怎么回事?编译器对“对象”有什么特殊的了解?
  • @KumarVivekMitra 你是对的。 objectObject 的别名,反之则不然。当您只是说 Object 时,编译器并不知道您实际上指的是 System.Object 或其他对象。例如 namespace MyNamespace { internal class Object {} class Strange : Object {} } 在这个例子中 Strange 类继承自 MyNamespace.Object 而不是 System.Object
  • @KumarVivekMitra 如果您将声明读为 objectSystem.Object 的别名,它可能会消除混淆,就像 stringSystem.String 的别名一样。 (99% 的人将using System 作为第一行代码,所以System.ObjectObject 对大部分代码的含义相同)。
【解决方案2】:

事实上,最简单的方法是不要认为objectObject 可以互换。

最好将object 理解为global::System.Object 的别名。因此,每当您看到 global::System.Object 作为类型名称时,您都可以改用 object,反之亦然。

如果名称 Object 将被解析为 global::System.Object 类型(例如,因为您有一个用于 System 命名空间的 using 指令,并且没有其他 using 指令会导入不同的 @ 987654332@ 类型),你可以使用Object 代替。

这两种引用类型的方式确实引用了完全相同的类型 - 生成的代码之间不会有差异:

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

object foo = ...;

顺便说一句,C# 5 规范在第 4.2.2 节中是这样描述的:

object 类型
object 类类型是所有其他类型的最终基类。 C# 中的每种类型都直接或间接地派生自对象类类型。

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

(在这种情况下不需要global:: 限定,因为规范本身中没有导入命名空间的概念......例如,System.Object 在规范中绝不可能意味着global::Foo.System.Object - 而它可以在C# 代码。)

【讨论】:

  • 先生,感谢您抽出宝贵时间来解释这一点,感谢您向我解释我怀疑背后的原因............而不是像@987654343那样直接给出出路@ 或 Alexei Levenkov 确实如此,但是我也很欣赏他们的努力......
【解决方案3】:

其实答案就在这里:

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 类型;用于装箱和拆箱使用对象。一个可能是另一个的别名,但链接上的文档和实际功能让我相信它们不能完全互换。

在 cmets 中,有些人根据编译器错误消息“您是否缺少 using 指令或程序集引用?”做出假设。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    相关资源
    最近更新 更多