我有一个关于对象类型转换的问题。 假设我们有:
A a = new A();
Object o = a;
据我所知,后面发生的事情是编译器将a的地址复制到o变量的内存区。那么,我们可以说 a 和 o 引用同一个对象。
如果我们这样做:
String s = "abc";
int a = (int)s;
然后我明白编译器不能将字符串值复制到int内存区。
但是如果我们有:
A a = new A();
B b = (B)a;
这在编译时可能没问题。但是,可能会发生运行时错误,类似于“无法转换...”。
所以,我不明白内存中到底发生了什么导致无法执行上述转换。是不是只是把a的地址复制到b的内存区?如果是这样,为什么不可能? 还是复制A的所有成员替换B的所有成员?
谢谢
最佳答案
编译器执行静态类型检查,这意味着如果 A 和 B 不属于同一继承层次结构,则不允许在两者之间进行强制转换。
想一想,如果它们不属于同一层次结构,即使编译器允许您将 A 的对象转换为 B 的类型,因为 A 不继承自 B 或其继承者,您可能希望调用其中一个方法类型为 B 的对象,它会在运行时失败。
class A { }
class B {
void Foo() { }
}
A a = new A();
B b = (B)a; // Compiler Error
// Hypothetically, if above was allowed, the below would ALWAYS fail at runtime
// Since there is no way the object "b" can handle this call.
b.Foo();
不过这里有一个有趣的点,如果 B 是一个接口(interface),即使它们不属于同一继承树,编译器也会让转换发生:
class A { }
interface B {
void Foo();
}
A a = new A();
B b = (B)a; // Compiler lets this happens
// Even though A does not implement B, but still one of the base classes of A
// might have implement B and A inherits that so it might be able to handle this
b.Foo();
这样做的原因是因为 A 可能来自不同的层次结构树,但 A 或其基类之一仍然有可能实现了 B,因此您可能通过该转换获得了一点并且编译器会允许。
关于c# - 关于 C# 中对象引用类型转换的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4083102/