为什么我的downcast在c#中失败了?

时间:2013-01-23 18:29:05

标签: c#

我有三种类型:

  1. Patient
  2. Inpatient : Patient
  3. Outpatient : Patient
  4. 我有一种方法可以填充基础患者及其所有属性:PatientRepository.FillPatient()并返回Patient个对象。

    然后,我需要查看并查看Patient类型的内容并向下转换为OutpatientInpatient

    当我尝试向下转换时,它正在抛出Unable to cast object of type 'Patient' to type 'Inpatient'.这是一个运行时错误。

    if (patient.Type == PatientType.Inpatient)
    {
        var inpatient = (Inpatient)patient;             
        return inpatient;
    }
    
    public enum PatientType
    {
        Inpatient, Outpatient
    }
    

    我不知道为什么。我从根本上做错了吗?

2 个答案:

答案 0 :(得分:3)

您的 FillPatient 应该以正确的方式返回特定的类:

public static Patient FillPatient()
{
    if (something) {
        return new InPatient();
    }
    else {
        return new OutPatient();
    }
}

然后你可以将它转发给特定的班级

Patient patient = PaitentRepository.FillPatient();

if (patient is InPatient) {
    ...
}
else {
    ...
}

注意:大多数情况下,当一个类是N个其他类的基础时,该基类(在您的情况下为 Patient )将是抽象的。

答案 1 :(得分:1)

因为问题说“投掷”我会认为这是一个运行时错误。这反过来意味着PatientRepository.FillPatient()返回Patient类型的对象,某处包含new Patient()。您可以将基类Patient标记为abstract,然后应该得到一些编译器错误。

如果要在某个时刻转换为子类型PatientRepository.FillPatient()必须创建此子类型的实例。因此,您需要使用new Patient()new Inpatient()而不是new Outpatient(),而不是{{1}},具体取决于您尝试填充的患者类型。