获取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将在这里完美地工作。