获取null对象的基础类型

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

并且generics不起作用

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

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

SF托盘是空的。

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

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

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

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

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

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

o是一个null引用(注意这里的措辞;它是空引用 ,而不是对空对象的引用 )。 这些参考文献没有不同的类型。 因此,您无法确定最初为null值赋值的变量的类型。

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

无论如何你需要什么? 可能还有另一种方法可以实现您的目标。

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

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

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

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

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

即使您在问题中将其大写,generics也不会起作用也是不正确的。

generics可以处理类型,而不是值。 Enumerable.Repeat(x, 3)将返回带有3个空项的IEnumerable ,而Enumerable.Repeat(o, 3)将返回带有3个空项的IEnumerable 。 枚举的类型不同表明generics将在这里完美地工作。