在下面的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
答案 0 :(得分:12)
要将Object
带入范围,您需要导入System
命名空间,而不是object
,这是一个关键字(对象的别名)。
将此添加到您的cs文件
using System;
甚至更简单地使用完全限定名称。
class A : System.Object
{
}
答案 1 :(得分:7)
事实上,最简单的做法是不要将object
和Object
视为可互换。
最好将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派生的,所以如果一个是另一个的别名,他怎么会遗漏一些东西?