我们知道,C#对象有一个指向它们类型的指针,因此当你调用GetType()它时,检查指针并返回一个对象的实际类型.但如果我这样做:
A objA = new A();
object obj = (object)objA;
if (obj.GetType() == typeof(object)) ; // this is true
Run Code Online (Sandbox Code Playgroud)
但这里发生了object obj = (object)objA;什么?它是否创建了某种引用对象,它引用objA了一个类型指针object,或者它是一个全新的对象,恰好指向相同的属性,字段等objA?当然,您现在可以访问这两个对象,它们将具有不同的类型,但指向相同的数据.这是如何运作的?
另一个问题是:GetType()是否保证返回对象的实际类型?例如,假设有一个带签名的方法,void Method(object sender)我们将类型的对象A作为参数传递.会sender.GetType()返回类型A,还是object?为什么?
其他棘手的事情是,你可以做(A)obj,它会工作.现在CLR如何成为obj曾经的类型A?
如果有人能比"C#通过CLR"更清楚地分解它,那将会很高兴.
更新.我的不好,应该在发布问题之前运行代码.所以,如果GetType()真的总是返回真实类型,那么所有其他问题也会变得清晰.
c# ×1