如果派生 class' "reference" 超出范围但基础 class 引用保留,派生对象是否会更改?

If a derived class' "reference" goes out of scope but the base class reference stays, does the derived object ever change?

(在 C# 5.0 中)这是一个非常简单的 yes/no 问题,我似乎找不到明确的答案,这可能意味着我在错误的地方寻找或在搜索时使用了错误的术语的答案。

如果我创建了一个派生的 class 对象,然后我将它转换为一个基 class 并且原始引用超出范围,该引用是否保存在基 class 中铸造保留整个派生 class 对象? IE。我可以稍后将其重铸为派生的 class 并且原始对象始终完好无损吗?

当然可以。如果转换为另一种类型,则只会将视图更改为同一对象。

这是对同一对象的引用。具有该引用值的表达式的编译时类型无关紧要。重要的是要了解实际上只有 一个 对象 - 它不像有一个基础 class 对象然后是一个关联的派生 class 对象。

这就是为什么你也可以沮丧:

string x = "hello";
object y = x;
string z = (string) y;

所有三个变量都具有相同的值 - 它们都是对同一对象的引用。没有信息丢失。引用本身只是 "a way of getting to an object" - 变量 确定哪些引用有效,并通知编译器哪些成员可以通过该变量访问,但它不会改变价值本身。

答案是肯定的。引用具有关联的类型,但引用的类型永远不会影响引用指向的实例的类型。

class A {}
class B : A {}

// Here we create an instance of B and assign it to a reference of
// type A (B is a subclass of A so this is correct). This doesn't
// change the type of B.
A a = new B();
Console.WriteLine(a.GetType()) // => prints B

// You can always assign to Object (doesn't change the type of the instance.
object o = a;
Console.WriteLine(o.GetType()) // => prints B

// And you can cast a reference to a different type, as long as they
// are compatible.
B b = (B)a;
Console.WriteLine(b.GetType()) // => prints B

C# language specification 第 6.1.6 节(隐式引用转换)对此进行了介绍:

Reference conversions, implicit or explicit, never change the referential identity of the object being converted. In other words, while a reference conversion may change the type of the reference, it never changes the type or value of the object being referred to.

(我的重点)


您的问题似乎是担心可能会发生类似于 Object Slicing 的事情 - 但 C# 中不会发生这种事情。