2

有人可以解释为什么这不起作用吗?

MyClass myClass1 = new MyClass();
object obj = myClass1;
MyClass myClass2 = obj; <-- error

如果 obj “指向” MyClass 类型的同一块内存,那么为什么我不能将 myClass2 “指向”最后一行的同一块内存?

谢谢你的帮助。

4

5 回答 5

7

myClass2 的类型是“ MyClass”。您可以为其分配任何属于或派生自 的类型的值MyClassobject不是也不是从 派生的MyClass,所以你需要一个演员表。

如果它能够隐式地做到这一点,如果你用一个不是真的 a 的对象做这件事会发生什么MyClass

于 2012-06-13T04:54:52.493 回答
7

c# 编译器只允许您从派生类隐式转换为基类,而不是相反。在您的情况下,您需要从 object 显式转换为 Myclass 这是派生类

于 2012-06-13T04:55:40.667 回答
3

因为这里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。您需要对其进行强制转换,以便如果它不是正确的类型,运行时将引发异常。

于 2012-06-13T05:05:43.733 回答
1

C# 是一种静态类型语言。你指出那obj是 type object。因为语言是静态类型的,你只能期望编译器尊重你指定的显式类型,obj并抱怨你试图把 anobject当作MyClass.

于 2012-06-13T05:06:21.410 回答
1
MyClass myClass1 = new MyClass();
MyClass myClass2 = myClass1 ;

您可以直接将 A 类型的类分配给相同类型的另一个类,但不能将对象分配给没有类型的对象,因为编译器不知道该对象是什么类型,所以在这种情况下您需要强制转换

MyClass myClass1 = new MyClass();
object obj = myClass1;
MyClass myClass2 = (MyClass)obj;

这会起作用,因为(MyClass)obj;告诉编译器 obj 是 MyClass 类型

于 2012-06-13T05:11:42.810 回答