c# - 关于 C# 中对象引用类型转换的问题?

标签 c# object types reference casting

我有一个关于对象类型转换的问题。 假设我们有:

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/

相关文章:

c# - 什么是 .exp 文件和 .lib 文件,我如何在我的 C# 项目中使用它们?

c# - 无法调用 Windows Azure 缓存的获取实例

c# - 在 C# 和 WPF 中选择屏幕截图不准确

c++ - 在另一个类中实现一个类的对象

python - python 字节数组在哪里使用?

haskell - 递归类型是haskell,它不重复相同的构造函数

c# - 套接字错误 : An existing connection was forcibly closed by the remote host

java - java中从List中随机选择一个对象

javascript - 如何在javascript中按下按钮时连续更改对象的属性值

mysql - int(x) 和 mediumint(x) 之间的区别 - MySQL