我在某处读过,
派生类(或子类)是其基类的实例。
鉴于此,我在继承基类时遇到以下问题。
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();
答案 0 :(得分:0)
让我们举一个更简单的例子。我们将有两个班级:
class Animal { }
class Horse : Animal { }
我们正在尝试调用此方法:
public Animal GetNewAnimal()
{
// content
}
所以如果我们写:
Horse newHorse = GetNewAnimal();
它给了我们一个转换异常。这是因为GetNewAnimal
返回一个Animal。它可能是一匹马,它可能是一头猪。由于编译器不能确定,并且你正在进行隐式投射,它说“我知道你想要一匹马,但我无法保证它会是,所以我给了“起来。
解决此问题的方法是执行显式转换。
Horse newHorse = (Horse)GetNewAnimal();
这告诉编译器返回类型将是Horse。但是,如果在运行时无法将返回值转换为Horse,系统将抛出InvalidCastException
。
因此,要映射到您的示例,请在我的帖子中删除所有马匹和动物,然后分别替换为TransactionCategorisationRuleViewModel
和CategorisationRuleViewModel
。
TransactionCategorisationRuleViewModel vmRule =
(TransactionCategorisationRuleViewModel)GetNewRule();
这会修复您的例外,但您承担GetNewRule
实际返回TransactionCategorisationRuleViewModel
的风险。返回TransactionCategorisationRuleViewModel
而不是基类类型可能更容易。