对'var'关键字和三元运算符有疑问?:

时间:2011-06-22 03:36:05

标签: c# type-inference ternary-operator var

如果在编译时解析了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?

3 个答案:

答案 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'类型。