条件运算符会混淆,但为什么呢?

BaB*_*aBu 5 c# compiler-construction inheritance

假设两个类,都是同一个超类的后代,如下所示:

class MySuperClass{}
class A : MySuperClass{}
class B : MySuperClass{}
Run Code Online (Sandbox Code Playgroud)

然后这个赋值不会通过编译器:

MySuperClass p = myCondition ? new A() : new B();
Run Code Online (Sandbox Code Playgroud)

编译器抱怨A和B不兼容(无法确定条件表达式的类型,因为'A'和'B'之间没有隐式转换 [CS0173]).但它们都是MySuperClass类型,所以在我看来这应该有效.不是说这是一个大问题; 只需要一个简单的强制转换即可启发编译器.但肯定是C#编译器的一个障碍?你不同意吗?

Ode*_*ded 10

条件的结果应该是相同的类型.他们不是.

MSDN,(?:运营商):

first_expression和second_expression的类型必须相同,或者从一种类型到另一种类型必须存在隐式转换.

由于A并且B不是同一类型,并且您似乎没有定义隐式转换,编译器会抱怨.

  • 是的,尝试添加演员阵容:`p = myCondition?(MySuperClass)new A():( MySuperClass)new B();` (3认同)