Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以';ti隐式地将此对象强制转换为类引用_C#_Oop - Fatal编程技术网

C# 为什么可以';ti隐式地将此对象强制转换为类引用

C# 为什么可以';ti隐式地将此对象强制转换为类引用,c#,oop,C#,Oop,有人能解释一下为什么这不起作用吗 MyClass myClass1 = new MyClass(); object obj = myClass1; MyClass myClass2 = obj; <-- error MyClass myClass1=新的MyClass(); object obj=myClass1; MyClass myClass2=obj myClass2的类型为“MyClass”。您可以为其指定属于或派生自MyClass的类型的任何值object不是并且不是从MyCl

有人能解释一下为什么这不起作用吗

MyClass myClass1 = new MyClass();
object obj = myClass1;
MyClass myClass2 = obj; <-- error
MyClass myClass1=新的MyClass();
object obj=myClass1;
MyClass myClass2=obj myClass2的类型为“
MyClass
”。您可以为其指定属于或派生自MyClass的类型的任何值
object
不是并且不是从
MyClass
派生的,因此需要强制转换


如果它能够隐式执行此操作,那么如果您使用的对象不是真正的
MyClass

c#编译器只允许您从派生类隐式转换到基类,而不是相反。在您的例子中,您需要显式地从object强制转换到Myclass,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.
因此,你需要一个演员。类似地,
对象
可以是
表单
按钮
MyClass
中的任何内容。您需要强制转换它,以便运行时在类型不正确时抛出异常。

C#是一种静态类型语言。您指出
obj
属于
object
类型。因为语言是静态类型的,所以您只能期望编译器尊重您为
obj
指定的显式类型,并抱怨您试图将
对象
当作
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

等待Jon Skeet answer=)我认为您必须学习a的基本知识。因为
对象->类类型
的一般情况可能会导致强制转换异常(并非所有对象都可以查看为
类类型
)。编译器正在强制强制强制转换为显式:如果您想要它,您可以得到它。虽然可以分析这个特殊的案例来说明,
obj
只命名了
MyClass
的一个实例,但这是一个非常具体的场景……好吧,我想我理解你的意思。我想我对对象是“通用”类型的想法感到困惑。谢谢。@user943870这就是原因。达米特在发布这篇文章时被打断了,我看到已经有被接受的答案了!很好的例子,很有道理。谢谢