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

本文关键字:转换 引用 不能 对象 为什么 | 更新日期: 2023-09-27 18:36:55

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

MyClass myClass1 = new MyClass();
object obj = myClass1;
MyClass myClass2 = obj; <-- error
如果 obj "指向"同一个内存块

,那么为什么我不能"指向"最后一行的同一个内存块呢?

感谢您的任何帮助。

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

myClass2 的类型是 " MyClass "。 您可以为其赋值属于或派生自 MyClass 的任何值。 object不是,也不是从MyClass派生出来的,所以你需要一个演员表。

如果它能够隐式地做到这一点,那么如果你使用一个不是真正MyClass的对象来做到这一点会发生什么?

C# 编译器只允许您从派生类隐式转换为基类,而不是相反。在您的情况下,您需要从对象显式转换为派生类 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.

因此,您需要一个演员表。类似地,object可以是FormButtonMyClass。您需要强制转换它,以便在它不是正确的类型时运行时将引发异常。

C# 是一种静态类型语言。 您指出obj属于 object 类型。 由于语言是静态类型的,因此您只能期望编译器遵守您为obj指定的显式类型,并抱怨您试图将object视为MyClass

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

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

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

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