gpt4 book ai didi

c# - 我不太了解 C# 中的转换

转载 作者:行者123 更新时间:2023-11-30 21:36:39 25 4
gpt4 key购买 nike

Class A
{
string name = "a";
public virtual void Rename(){//rename name to aaa}
}

Class B:A
{
string name = "b";
public override void Rename(){//rename name to bbb}
}

void Main()
{
B objB = new B();
A objA = objB as A;
print(objB.name);// b
print(objA.name);// a
objA.Rename();
print(objB.name);// bbb
print(objA.name);// a
}

为什么我用objA.Rename()的时候,居然用的是B类写的override版本,到底什么是objA。如果它是 A,那么它为什么使用覆盖版本。如果是 B 那么为什么 objA.name 不是 bbb;

最佳答案

对象永远不会改变。在内存中,它始终是 B,无论您选择如何与之交互。了解这种情况的方法是在您的变量上调用 .GetType(),它们都会告诉您每个变量都是 B 的一个实例。

B objB  = new B();
A objA = objB as A;
Console.WriteLine(objB.GetType()) // B
Console.WriteLine(objA.GetType()) // B

你在最后得到 "a" 的原因是因为你有两个 不同的 name 声明。意思是:A.name 是一个与 B.name

完全 不同的地址

要解决此问题,您只需从 B 中删除 string name = "b"; 并改为放置 name = "b";进入它的构造函数。

Class A
{
string name = "a";
public virtual void Rename(){//rename name to aaa}
}

Class B:A
{
public override void Rename(){//rename name to bbb}
public B() { name = "b"; }
}

另一种思考方式是,如果您在 B 中调用 base.name,我相信您会得到与 "a"相同的结果,向您展示 B 实际上有两个单独的 name 声明。

关于c# - 我不太了解 C# 中的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47947074/

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