问题描述
||
如果在编译时解析了“ 0”关键字,那么以下内容如何工作?
class A {
}
class B : A {
}
int k = 1;
var x = (k < 0) ? new B() : new A();
编辑:
我终于明白,问题不在于ѭ0本身,而是关于?:
运算符的行为。出于某种原因,我认为可能会发生以下情况:
object x = something ? 1 : \"\"
那根本不可能:)
相关问题(关于三元运算符):
为什么在三元运算符中分配null失败:null和int之间没有隐式转换?
解决方法
结果为
A
类型,因为两个变量均为A
类型,并且至少其中一个变量直接为A
类型(而不是通过某种转换)。
编译器查看三元表达式的两个部分,如果其中一个是另一个的子类型,则整个表达式将成为更通用的超类型。
但是,如果两者都不是通用类型,那么就会发生编译器错误,可能是因为它不知道需要为您升级多少(也不希望找出来)。
看这里:
条件运算符(?:)根据布尔表达式的值返回两个值之一。以下是条件运算符的语法。
condition ? first_expression : second_expression;
[...]
first_expression和second_expression的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。
, 结果是A
。一种简单的确认方法是将鼠标放在var
上。
, 我还没有测试过这种退化的情况。但我敢打赌,要么(1)编译器抱怨,要么(2)\'x \'类型为\'A \'。