众所周知,C#对象具有指向其类型的指针,因此当您调用GetType()
时,它会检查该指针并返回对象的实际类型。但如果我这样做:
A objA = new A();
object obj = (object)objA;
if (obj.GetType() == typeof(object)) ; // this is true
但是,在
object obj = (object)objA;
这里会发生什么呢?它会创建某种引用对象引用 objA
,但具有指向 object
的类型指针,还是它是一个全新的对象,只是恰好指向与 objA
相同的属性、字段等。当然,现在可以访问两个对象,并且它们将具有不同的类型,但指向相同的数据。这是如何工作的?另一个问题是:GetType()是否保证返回对象的实际类型?例如,假设有一个签名为
void Method(object sender)
的方法,我们将 A
类型的对象作为参数传递。那么,sender.GetType()
会返回类型 A
还是 object
?为什么呢?另一个棘手的问题是,你可以执行
(A)obj
,它会起作用。CLR 如何知道 obj
曾经是类型 A
?如果有人能比 "C# via CLR" 更清晰地解释一下,那就太好了。
更新。我错了,在发布问题之前应该先运行代码。所以,如果 GetType() 确实总是返回实际类型,那么所有其他问题也变得清晰明了。