获取null对象的基础类型

时间:2010-09-06 08:41:06

标签: c#

User x = null;
object o = x;
// determine type with only reference to o

泛型不起作用

5 个答案:

答案 0 :(得分:11)

想象一下,你有一个图书馆。想象一下,你还有一盒卡片,每本书一张卡片。 (较年轻的读者:在计算机过时之前,实际上曾经使用这些系统的库。)

现在想象你有两个托盘。一个托盘标记为“科幻小说”,另一个托盘标记为“任何书籍”。

SF托盘是空的。

您告诉助理图书管理员“转储任何托盘中的任何内容,然后复印SF托盘中的任何内容并将副本放入任何托盘中。”

倾倒任何托盘后,它变空,由于SF托盘是空的,因此无需复印,因此任何托盘都保持空白。

你问题的类似物现在是“这张卡在任何托盘中的书的类型是什么?”答案是“没有这样的类型,因为 Any托盘是空的”。这不像SF托盘是空的,以某种方式“感染”任何托盘使其“空,但SF味道”。

这有意义吗?变量只是存储位置; null引用是指“这根本不引用任何东西”的引用,并且没有“什么都没有”的味道。

有关此区别的更多信息,请参阅我关于此主题的文章:

http://blogs.msdn.com/b/ericlippert/archive/2009/10/29/i-have-a-fit-but-a-lack-of-focus.aspx

答案 1 :(得分:9)

onull引用(请注意此处的措辞;它是 null引用,而不是对空对象的引用)。这些参考文献没有不同的类型。因此,您无法确定最初为null值分配的变量的类型是什么。

答案 2 :(得分:1)

我认为你不能这样做。 Object.GetType()方法当然不适用于null,而Type.GetType方法需要一个名称或句柄,因此它们也不起作用。

无论如何你需要什么?可能有另一种方法来完成你所追求的目标。

答案 3 :(得分:0)

Null不是一个对象。 Null不是一个实例。 Null只是语言语法,用于清除引用变量并使其引用“无处”。

你不能得到'null'的类型,就像你无法描述'无处'的样子一样。

答案 4 :(得分:0)

null是一个可以分配给不同类型的值。

在您问题的示例中,x的类型为User,o的类型为object。因此,您可以编译Uri u = o,但不能编译Uri u = x。在运行时,前者也可以工作,因为Uri s允许空值但是对象不是null而是User对象,它会出错,因为该值无法转换为Uri

null表示“此值不是对内存中某个对象的引用”。在内存中的任何地方都不是一个对象,无论类型如何都是一样的。

即使您在问题中将其大写,但仿制药也无法正常工作。

泛型可以处理类型,而不是值。 Enumerable.Repeat(x, 3)将返回包含3个空项的IEnumerable<User>,而Enumerable.Repeat(o, 3)将返回包含3个空项的IEnumerable<object>。枚举的类型不同表明泛型在这里可以很好地工作。