C# 将派生类强制转换为彼此

C# 将派生类强制转换为彼此,c#,inheritance,C#,Inheritance,据我所知,不允许将一个派生类强制转换为另一个派生类,因此假设ClassB和ClassC派生自同一ClassA,这将不起作用: ClassB b = new ClassB(); ClassC c = new ClassC(); c = b; 但是下面的代码是有效的,我不太明白为什么: ClassA b = new ClassB(); ClassA c = new ClassC(); c = b; 有人能详细解释一下这里发生了什么吗?我将用以下方式更改您的类型,看看它是否能让情况更清楚:

据我所知,不允许将一个派生类强制转换为另一个派生类,因此假设
ClassB
ClassC
派生自同一
ClassA
,这将不起作用:

ClassB b = new ClassB();

ClassC c = new ClassC();

c = b;
但是下面的代码是有效的,我不太明白为什么:

ClassA b = new ClassB();

ClassA c = new ClassC();

c = b;

有人能详细解释一下这里发生了什么吗?

我将用以下方式更改您的类型,看看它是否能让情况更清楚:

ClassA --> Animal
ClassB --> Tiger
ClassC --> Giraffe
在本例中:

Tiger b = new Tiger();

Giraffe c = new Giraffe();

c = b;
c
变量必须引用类型为
Giraffe
的实例。尝试为其分配对
老虎的引用是无效的,因为
老虎
不是
长颈鹿

您的下一个示例:

Animal b = new Tiger();

Animal c = new Giraffe();

c = b;
是有效的,因为
长颈鹿
老虎
都是
动物
s,所以从必须引用
动物的变量中引用
老虎
长颈鹿
是完全可以的

请注意,这些代码都不会更改所创建对象的实际类型
c
b
只是对对象的引用。当你说

c = b;
您所做的只是更改
c
引用的对象-它现在引用与
b
相同的对象。用来指向的
c
对象现在是孤立的(在任何地方都没有对它的引用)

如果你那么做了

b.Name = "Sam";

您可以通过
b
引用和
c
引用看到这种变化

如果您这样设置类:

class ClassA
{
    public int a;
}

class ClassB : ClassA
{
    public string b;
}
然后你可以这样做:

ClassA B = new ClassB();
B.a = 1;
但不是这个:

B.b = "b";

编译器抱怨ClassA不包含“b”的定义。换句话说,它只把B当作a类来对待。这就是为什么可以从C转换到B。

第二个示例看起来像是编译的东西,但在运行时会崩溃。第二个示例看起来像正常的多态性-
B
C
都是对基类的引用,没有发生“侧转换”here@wotanii它为什么会崩溃
ClassC
ClassB
都是从
ClassA
派生而来的,所以在编译时和运行时它都是完全有效的赋值。@Vikhram有什么问题需要标记?这是一个完全有效的引用赋值。@Vikhram它不是注定要失败的。它工作正常。c用来指向的对象不是孤立的。你是说“现在”而不是“不”吗?否则我不确定我understand@Ecnerwal是的。修好了,不是铸造。它只是重新分配一个变量(引用类型
ClassA