有人可以解释为什么这不起作用吗?
MyClass myClass1 = new MyClass();
object obj = myClass1;
MyClass myClass2 = obj; <-- error
如果 obj “指向” MyClass 类型的同一块内存,那么为什么我不能将 myClass2 “指向”最后一行的同一块内存?
谢谢你的帮助。
myClass2 的类型是“ MyClass
”。您可以为其分配任何属于或派生自 的类型的值MyClass
。 object
不是也不是从 派生的MyClass
,所以你需要一个演员表。
如果它能够隐式地做到这一点,如果你用一个不是真的 a 的对象做这件事会发生什么MyClass
?
c# 编译器只允许您从派生类隐式转换为基类,而不是相反。在您的情况下,您需要从 object 显式转换为 Myclass 这是派生类
因为这里object
是基类。
如果我有这个:
class Square : Shape
{
}
class Circle : Shape
{
}
我可以
Shape c = new Circle();
从语义上考虑,圆形是一种形状。我可以将圆形存储为形状。
但我不能这样做:
Circle c = new Shape();
因为形状不是圆形,它可能是正方形。考虑:
Shape sq = new Square();
Shape cr = new Circle();
根据您的看法,这应该可以工作:
Circle x = cr;
但是如果没有演员表,即使这样也应该起作用:
Circle x = sq;//this will blow up, sq is a square.
因此你需要一个演员表。类似地,anobject
可以是任何 a Form
、 aButton
或 a MyClass
。您需要对其进行强制转换,以便如果它不是正确的类型,运行时将引发异常。
C# 是一种静态类型语言。你指出那obj
是 type object
。因为语言是静态类型的,你只能期望编译器尊重你指定的显式类型,obj
并抱怨你试图把 anobject
当作MyClass
.
MyClass myClass1 = new MyClass();
MyClass myClass2 = myClass1 ;
您可以直接将 A 类型的类分配给相同类型的另一个类,但不能将对象分配给没有类型的对象,因为编译器不知道该对象是什么类型,所以在这种情况下您需要强制转换
MyClass myClass1 = new MyClass();
object obj = myClass1;
MyClass myClass2 = (MyClass)obj;
这会起作用,因为(MyClass)obj;
告诉编译器 obj 是 MyClass 类型