错误将派生类分配给返回基类的函数的输出

时间:2014-07-01 15:43:22

标签: c# asp.net-mvc

我在某处读过,

  

派生类(或子类)是其基类的实例。

鉴于此,我在继承基类时遇到以下问题。

public class TransactionCategorisationRuleViewModel : CategorisationRuleViewModel
{
    public long TransactionId { get; set; }

    [Display(Name="Apply to All Transactions")]
    public bool IsApplyAll { get; set; }

}

我还有一个具有以下定义的函数:

public CategorisationRuleViewModel GetNewRule()
{
     // content
}

但是,当我这样做时,我收到一个错误(无法隐式转换类别CategorisationRuleViewModel到TransactionCategorisationRuleViewModel。)

TransactionCategorisationRuleViewModel vmRule = GetNewRule();

1 个答案:

答案 0 :(得分:0)

让我们举一个更简单的例子。我们将有两个班级:

class Animal { }

class Horse : Animal { }

我们正在尝试调用此方法:

public Animal GetNewAnimal()
{
    // content
}

所以如果我们写:

Horse newHorse = GetNewAnimal();

它给了我们一个转换异常。这是因为GetNewAnimal返回一个Animal。它可能是一匹马,它可能是一头猪。由于编译器不能确定,并且你正在进行隐式投射,它说“我知道你想要一匹马,但我无法保证它会是,所以我给了“起来。

解决此问题的方法是执行显式转换。

Horse newHorse = (Horse)GetNewAnimal();

这告诉编译器返回类型将是Horse。但是,如果在运行时无法将返回值转换为Horse,系统将抛出InvalidCastException


因此,要映射到您的示例,请在我的帖子中删除所有马匹和动物,然后分别替换为TransactionCategorisationRuleViewModelCategorisationRuleViewModel

TransactionCategorisationRuleViewModel vmRule = 
    (TransactionCategorisationRuleViewModel)GetNewRule();

这会修复您的例外,但您承担GetNewRule实际返回TransactionCategorisationRuleViewModel的风险。返回TransactionCategorisationRuleViewModel而不是基类类型可能更容易。