C#中的三元运算符

本文关键字:三元 运算符 | 更新日期: 2023-09-27 18:27:05

有人能向我解释一下当你使用三元运算符时,幕后会发生什么吗?这行代码是吗

string str = 1 == 1 ? "abc" : "def";

是作为一个简单的if/else语句生成的吗?考虑以下内容:

class A
{
}
class B : A
{
}
class C : A
{
}

现在使用如下三元表达式:

A a1 = 1 == 1 ? new B() : new C();

这甚至没有编译这个错误:

无法确定条件表达式的类型,因为"ConsoleApp1.B"answers"ConsoleApp.C"之间没有隐式转换

有人能阐明这一点吗?

C#中的三元运算符

条件运算符表达式的类型必须为第二个操作数的类型或第三个操作数类型。因此,其中一个必须可以转换为另一个。

在你的情况下,它们不能相互转换,但都可以转换为第三种类型(a)。编译器不考虑这一点,但您可以强制执行:

A a1 = 1 == 1 ? new B() : (A) new C();

A a1 = 1 == 1 ? (A) new B() : new C();

有关更多详细信息,请参见C#4规范的7.14节。

msdn的摘录?操作员

若条件为true,则计算第一个表达式并将其作为结果;如果为false,则计算第二个表达式并将其作为结果。只有两个表达式中的一个被求值。

它非常明确。

你的错误也很明显,你试图把B分配给C。。。但是没有可用的强制转换,所以错误。。。非常简单的

根据是否存在转换,条件运算符将有效地将第一个表达式的类型用于第二个表达式,并且不考虑基数(否则它将始终转到object,允许这样做:? "hello" : 10)。

在这种情况下,编译器是正确的——这两种类型之间没有转换。然而,在第一个上添加一个强制转换,它将编译(A)new B()

它非常明确。

你的错误也很明显,你试图给a C。。。但是没有可用的强制转换,所以错误。。。相当简单的

根本不相关。

B和C来源于A.

表达式为:

a1=1==1?new B():new C();

两个表达式都返回从派生的类型

编译器只查看?的表达式:运算符,并且不在乎变量a1的类型是什么(表达式的左侧)。。。这样实施的原因非常有趣。。。