C# - 基础类型的强制转换是如何工作的?

Dam*_*ury 2 c# casting class object

这可能是重复的,但我找不到类似的问题.我不明白如何在没有数据丢失的情况下对基类型进行隐式转换.例如,我创建了这个类Person:

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我做以下时:

object personAsObject = new Person { Name = "Foo", Age = 1 };
var person = (Person) personAsObject;
Console.WriteLine(person.Name);
Console.WriteLine(person.Age);
Run Code Online (Sandbox Code Playgroud)

怎么样object能够保持属性的值Name,并Age因为它只有4种方法Equals,GetHashCode,GetTypeToString?为什么对子类的强制转换会抛出InvalidCastException?我希望这是可能的,因为如果成员不是私人的,那么他们就会被继承.

And*_*erd 9

一切都与参考有关.

personAsObject不是一个实例的的对象.

当您调用时new Person,您Person在托管内存中创建了一个实例.

该变量personAsObject是一个引用:指向Person对象所在的托管内存位置的指针.

这同样适用于person:它不是一个实例Person,它是为一个参考Person(这恰好是同一对象personAsObject所引用)在存储器中.

VARIABLES                  MANAGED MEMORY
=========                  ==============

personAsObject----|     +-----------------+
                  |---->| Person Instance |
person------------|     +-----------------+
Run Code Online (Sandbox Code Playgroud)

  • @DamienFlury:请忽略该评论;**值类型不"活在堆栈中"**.值类型**按值**复制**并按值**居住变量.你是否认为如果你制造了一百万个整数的数组,那么这四个整数就会以1兆的堆栈生存?当然不是.值类型值不再比引用更"在堆栈上"; 值类型值变量*和变量*在存储池中实时*通过对其生命周期*的分析确定. (3认同)