【发布时间】:2010-07-21 18:45:03
【问题描述】:
众所周知,C# 对象有一个指向其类型的指针,因此当您调用 GetType() 时,它会检查该指针并返回对象的真实类型。但如果我这样做:
A objA = new A();
object obj = (object)objA;
if (obj.GetType() == typeof(object)) ; // this is true
但是object obj = (object)objA; 这里发生了什么?它是否创建某种引用对象,引用objA,但有一个指向object 的类型指针,或者它是一个全新的对象,恰好指向与@ 相同的属性、字段等987654326@?当然,您现在可以访问这两个对象,它们将具有不同的类型,但指向相同的数据。它是如何工作的?
另一个问题是:GetType() 是否保证返回对象的实际类型?例如,假设有一个签名为void Method(object sender) 的方法,我们将A 类型的对象作为参数传递。 sender.GetType() 会返回类型A 还是object?为什么?
其他棘手的事情是您可以执行(A)obj 并且它会起作用。既然 obj 曾经是 A 类型,那么 CLR 怎么办?
如果有人能比“C# via CLR”更清楚地分解它,我会很高兴。
更新。我的错,应该在发布问题之前运行代码。所以,如果GetType() 真的总是返回真实类型,那么所有其他问题也会变得清晰。
【问题讨论】:
-
您的问题是基于一个完全错误的前提。标有“这是真的”的那行不是真的。如果您不相信我,请尝试编写一个实际编译和运行的小程序。 GetType() 总是返回对象的实际运行时类型。您所有的问题都基于编译时类型与它有关的错误假设。它没有。
-
@Eric,嗯,你是对的,这就是我一直认为的,因为项目中一些行为不同的代码而分心,我的错。
标签: c#