c# - 在三元条件语句中更改动态的类型
问题描述
在 C# 中,类型dynamic
允许您在运行时更改变量的类型,例如:
dynamic x = "foo";
x = 42;
另一个例子:
dynamic x;
if (true)
x = "foo";
else
x = 42;
但是,当使用速记“?:”三元条件语句时,
dynamic x = (true) ? "foo" : 42;
不会编译:
错误 CS0173:无法确定条件表达式的类型,因为 'string' 和 'int' 之间没有隐式转换
为什么呢?
解决方案
规范中有这样说它如何使用操作数来确定三元表达式的类型:
?: 运算符的第二个和第三个操作数 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 否则,无法确定表达式类型,并发生编译时错误。
显然,这些(不包括最后的语句)对于string
and都不是真的int
,所以你会得到编译时错误。
本质上,您将三元结果分配给的变量类型不会影响三元表达式的结果类型。如果要返回动态,则需要将其中一个操作数直接转换为动态,如下所示:
dynamic x = (true) ? (dynamic) "foo" : 42;
推荐阅读
- javascript - React Ag-Grid 外部滤波器输出从输入延迟
- python - 我的函数的哪一部分导致 TypeError:列表索引必须是整数或切片,而不是浮点数?
- python - 我试图在 json 中输出一个键等于一个特定值
- r - 如何使用R将多列堆叠成一列
- python - 如何让 Flask-admin 面板使用模型的 init 方法?
- javascript - Javascript 脚本适用于 HTML 页面,但不适用于单独的 .js 文件
- python - 在曲线的开始和结束处用numpy的曲率急剧不正确的跳跃计算曲率?
- javascript - 如何在页面加载时显示占位符而不是状态值?
- c++ - 尝试在类中使用 std::vector::push_back 时得到“_throw_bad_array_new_lengthv”
- python - 重置熊猫数据框中的索引计数