首页 > 解决方案 > 在三元条件语句中更改动态的类型

问题描述

在 C# 中,类型dynamic允许您在运行时更改变量的类型,例如:

dynamic x = "foo";
x = 42;

另一个例子:

dynamic x;
if (true)
    x = "foo";
else
    x = 42;

但是,当使用速记“?:”三元条件语句时,

dynamic x = (true) ? "foo" : 42;

不会编译:

错误 CS0173:无法确定条件表达式的类型,因为 'string' 和 'int' 之间没有隐式转换

为什么呢?

标签: c#if-statement

解决方案


规范中有这样说它如何使用操作数来确定三元表达式的类型:

?: 运算符的第二个和第三个操作数 x 和 y 控制条件表达式的类型。

• 如果 x 具有 X 类型并且 y 具有 Y 类型,那么,

o 如果 X 和 Y 是相同类型,则这是条件表达式的类型。

o 否则,如果存在从 X 到 Y,但不存在从 Y 到 X 的隐式转换(第 11.2 节),则 Y 是条件表达式的类型。

o 否则,如果存在从 X 到 Y 的隐式枚举转换(第 11.2.4 节),则 Y 是条件表达式的类型。

o 否则,如果存在从 Y 到 X 的隐式枚举转换(第 11.2.4 节),则 X 是条件表达式的类型。

o 否则,如果存在从 Y 到 X 的隐式转换(第 11.2 节),而不是从 X 到 Y,则 X 是条件表达式的类型。

o 否则,无法确定表达式类型,并发生编译时错误。

显然,这些(不包括最后的语句)对于stringand都不是真的int,所以你会得到编译时错误。

本质上,您将三元结果分配给的变量类型不会影响三元表达式的结果类型。如果要返回动态,则需要将其中一个操作数直接转换为动态,如下所示:

dynamic x = (true) ? (dynamic) "foo" : 42;

推荐阅读