C# 为什么将父对象强制转换为子对象不是编译时错误

C# 为什么将父对象强制转换为子对象不是编译时错误,c#,inheritance,C#,Inheritance,如果Parent是继承Employee类的父类,那么为什么呢 Person p = new Person(); Employee e1 = (Employee)p; 这不是编译时错误吗? 编译器不应该在编译时计算出来。,因为它也可能是有效的。例如: Person p = new Employee(); Employee e1 = (Employee)p; 为什么您希望编译器产生错误 更清楚地说,让我们假设不允许从基类转换到派生类。 那你怎么做呢 object o = new Employee

如果
Parent
是继承
Employee
类的父类,那么为什么呢

Person p = new Person();
Employee e1 = (Employee)p;
这不是编译时错误吗?
编译器不应该在编译时计算出来。

,因为它也可能是有效的。例如:

Person p = new Employee();
Employee e1 = (Employee)p;
为什么您希望编译器产生错误

更清楚地说,让我们假设不允许从基类转换到派生类。 那你怎么做呢

object o = new Employee();
Employee e1 = (Employee)o;

若编译器阻止您在编译时强制转换,那个么您就不能取消装箱任何已装箱的结构等,这是绝对需要的

能够将父对象强制转换为子对象非常有用。这是可能的,因为Microsoft的.net的中间语言(IL)中有一些特定的特性。在编译时,在开始编译类的“细节”之前,每个类的基础都在IL中定义。因此,在编译时不会有父关系依赖项。(与C++相比,严格遵循依赖关系)。你是指<代码>人>代码>而不是<代码>父< /代码>?你的意思是说
员工
继承自
个人
,而不是相反吗?我最初的问题很清楚,没有这些问题,有人编辑了它,把名字弄乱了。是的,这是一个人,他是父母,雇员是孩子。无论如何……我理解对象0=新员工()的意义。然而,Person p=new Employee()显然是在说Parent持有child的引用(或者即使它是Parent本身),然后将其向下转换为child显然是错误的。如果我是编译器,这肯定不会编译…无论如何谢谢你的解释。我在我们的一个旧代码中发现了这个bug,并认为编译器应该大喊……编译器不能,假设
Person p
是一个实例变量,那么其他线程有可能在转换为
Employee
之前设置一个有效的
Employee
,不是吗?在编译时,编译器不能肯定地说它是错的。但对于局部变量,我认为编译器至少可以产生警告。@ahsant给定
Person p=new Person()
,编译器不知道实际变量
p
指向的类型。您的意思是编译器可以查看变量声明并说“嘿,
p
指向一个
,这个人不能被转换为
员工
!”——但这比您想象的要复杂得多。如果声明发生在外部范围内会怎样?通过查看上面几行的声明,让编译器检测到局部变量
p
无法强制转换为
Employee
,这不是一个值得实现的功能。编译器在很多方面都可以帮助您,但您不能指望它一直握着您的手。@dcastro但是。。。我想知道为什么resharper也没有这样的功能。为什么这不属于静态分析?