如果在编译时解析了var
关键字,以下工作原理如何?
class A {
}
class B : A {
}
int k = 1;
var x = (k < 0) ? new B() : new A();
修改
我终于明白问题不在于var
本身,而在于?:
运算符的行为。出于某种原因,我认为以下是可能的:
object x = something ? 1 : ""
这根本不可能:)
相关问题(关于三元运算符):
Why assigning null in ternary operator fails: no implicit conversion between null and int?
答案 0 :(得分:13)
结果类型为A
,因为这两个变量的类型都为A
,其中至少有一个是{em>直接类型A
(不是通过一些转换)。
编译器会查看三元表达式的两个部分,如果其中一个是另一个的子类型,则整个表达式将成为更一般的超类型。
然而,如果两者都不是直接的普通类型,那么就会发生编译错误,可能是因为它不知道要为你提升多少(并且它不想找出来)。
请参阅here:
条件运算符(?:)根据布尔表达式的值返回两个值中的一个。以下是条件运算符的语法。
condition ? first_expression : second_expression;
[...]
first_expression和second_expression的类型必须相同,或者从一种类型到另一种类型必须存在隐式转换。
答案 1 :(得分:2)
结果是A
。确认它的一种简单方法是将鼠标放在var
上。
答案 2 :(得分:-7)
我没有测试过这种堕落的情况。但我敢打赌(1)编译器抱怨或(2)'x'是'A'类型。