为什么我不能隐式地将此对象强制转换为类引用

时间:2012-06-13 04:51:53

标签: c# oop

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

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

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

感谢您的帮助。

5 个答案:

答案 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可以是FormButtonMyClass。您需要强制转换它,以便运行时如果它不是正确的类型,将抛出异常。

答案 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