C#中的三元运算符

Lir*_*ins 2 .net c# compiler-errors ternary-operator

任何人都可以向我解释当你使用三元运算符时幕后会发生什么?这行代码:

string str = 1 == 1 ? "abc" : "def";
Run Code Online (Sandbox Code Playgroud)

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

class A
{
}

class B : A
{
}

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

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

A a1 = 1 == 1 ? new B() : new C();
Run Code Online (Sandbox Code Playgroud)

这甚至没有使用此错误编译:

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

任何人都可以阐明这个吗?

Jon*_*eet 8

类型条件运算符表达的需要是或者所述第二操作数的类型所述第三操作数的类型.所以其中一个必须可以转换为另一个.

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

A a1 = 1 == 1 ? new B() : (A) new C();
Run Code Online (Sandbox Code Playgroud)

要么

A a1 = 1 == 1 ? (A) new B() : new C();
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅C#4规范的第7.14节.