为什么我不能将此对象隐式强制转换为类引用
本文关键字:转换 引用 不能 对象 为什么 | 更新日期: 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
可以是Form
、Button
或MyClass
。您需要强制转换它,以便在它不是正确的类型时运行时将引发异常。
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 的类型