我刚收到以下错误:
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;
}
你能告诉我为什么会这样吗?
答案 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已经说过:你必须明确地将两者中的一个强制转换为基类,以便进行隐式转换。