有人可以解释为什么这不起作用?
MyClass myClass1 = new MyClass();
object obj = myClass1;
MyClass myClass2 = obj; <-- error
如果obj“指向”MyClass类型的同一块内存,那么为什么我不能将myClass2“指向”最后一行的同一块内存?
感谢您的帮助。
答案 0 :(得分:7)
myClass2的类型是“MyClass
”。您可以为其分配任何属于MyClass
的类型的值。 object
不是MyClass
,也不是MyClass
,因此您需要演员。
如果它能够隐式地执行此操作,那么如果您使用的对象实际上不是{{1}}会发生什么?
答案 1 :(得分:7)
c#编译器只允许您从派生类隐式转换为基类,而不是相反。在您的情况下,您需要显式地从对象转换为Myclass,这是派生类
答案 2 :(得分:3)
因为此处object
是 base 类。
如果我有这个:
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.
因此你需要演员。同样地,object
可以是Form
,Button
或MyClass
。您需要强制转换它,以便运行时如果它不是正确的类型,将抛出异常。
答案 3 :(得分:1)
C#是一种静态类型语言。您表示obj
的类型为object
。因为语言是静态类型的,所以您只能期望编译器尊重您为obj
指定的显式类型,并抱怨您正在尝试将object
视为一样是MyClass
。
答案 4 :(得分:1)
MyClass myClass1 = new MyClass();
MyClass myClass2 = myClass1 ;
你可以直接将类型A的类分配给另一个相同类型的类,但不能直接将类型为out的对象分配,因为编译器不知道该对象是什么类型,所以在这种情况下你需要一个强制转换
MyClass myClass1 = new MyClass();
object obj = myClass1;
MyClass myClass2 = (MyClass)obj;
这将起作用,因为(MyClass)obj;
告诉编译器obj的类型为MyClass