gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:57:56 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com