两个对象之间没有隐式转换? - 运营商

时间:2014-06-14 21:22:03

标签: c#

我刚收到以下错误:

There is no implicit conversion between 'ViewModelA' and 'ViewModelB'

尝试实现以下代码行时发生此错误:

ViewModel myViewModel = conditionIsTrue() ? _viewModelA : _viewModelB;

两个ViewModel都继承自ViewModel,但它们是两个不同的子类。

但是,如果我避开 ? - 运算符 并使用 if / else ,那么它可以正常工作:< / p>

ViewModel myViewModel;
if (conditionIsTrue(){
   myViewModel = _viewModelA;
}else{
   myViewModel = _viewModelB;
}

你能告诉我为什么会这样吗?

3 个答案:

答案 0 :(得分:2)

表达式

conditionIsTrue() ? _viewModelA : _viewModelB
在真正考虑ViewModel myViewModel =部分之前,

会自行评估。 this operator的结果必须评估为单一类型。在上面的表达式的上下文中,编译器使用什么类型并不明显,因此它会引发错误。我建议将其中一个转换为ViewModel,以便编译器知道表达式的类型:

ViewModel myViewModel = conditionIsTrue() ? (ViewModel)_viewModelA : _viewModelB;
//or with var
var myViewModel = conditionIsTrue() ? (ViewModel)_viewModelA : _viewModelB;

或者可能只是像第二个例子那样在不同的行上进行:

ViewModel myViewModel;
if (conditionIsTrue() {
   myViewModel = _viewModelA;
} else {
   myViewModel = _viewModelB;
}

答案 1 :(得分:2)

即使它们共享共同基础,您仍然需要明确地投射它们。

ViewModel myViewModel = conditionIsTrue() 
    ? (ViewModel)_viewModelA 
    : (ViewModel)_viewModelB;

检查c#documentation

?:运算符的第二个和第三个操作数控制条件表达式的类型。设X和Y是第二个和第三个操作数的类型。然后,

如果X和Y的类型相同,那么这就是条件表达式的类型。

否则,如果从X到Y存在隐式转换(第6.1节),而不是从Y到X,则Y是条件表达式的类型。

否则,如果从Y到X存在隐式转换(第6.1节),而不是从X到Y,则X是条件表达式的类型。

否则,无法确定表达式类型,并发生编译时错误。

答案 2 :(得分:1)

这个问题已经回答here,我引用了C#规范:

  

?:运算符的第二个和第三个操作数控制条件表达式的类型。设X和Y是第二个和第三个操作数的类型。然后,

     

如果X和Y的类型相同,那么这就是条件表达式的类型。

     

否则,如果从X到Y存在隐式转换(第6.1节),而不是从Y到X,则Y是条件表达式的类型。

     

否则,如果从Y到X存在隐式转换(第6.1节),而不是从X到Y,则X是条件表达式的类型。

     

否则,无法确定表达式类型,并发生编译时错误

您的问题是实际上不存在隐式转换。正如HåvardS已经说过:你必须明确地将两者中的一个强制转换为基类,以便进行隐式转换。