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
)