【问题标题】:What type can I expect from a ternary operation? [duplicate]我可以从三元运算中获得什么类型? [复制]
【发布时间】:2012-06-17 21:35:18
【问题描述】:

可能重复:
Why is this code invalid in C#?
Conditional operator cannot cast implicitly?

如果我执行以下操作:

bool someBool = false;
uint value = 0;

这些都很好:

value = (someBool) ? 0 : (uint)1;
value = (someBool) ? (uint)0 : 1;

但这不是:

value = (someBool) ? 0 : 1;

我可以很容易说,为什么我不能使用最后一个:

value = 0;
value = 1;

三元运算符的类型是如何确定的?

【问题讨论】:

    标签: c# ternary-operator


    【解决方案1】:

    您必须将其转换为 uint 以便编译器知道。 0 和 1 都可以是 uintint

    这里是语言规范(可以从 MSDN here 下载):

    ?的第二个和第三个操作数:操作符控制类型 条件表达式。设 X 和 Y 是第二个和 第三个操作数。那么,

    如果 X 和 Y 是同一类型,那么这是条件的类型 表达。

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

    否则,如果存在从 Y 到 X 的隐式转换,而不是从 X 到 Y,那么 X 就是条件表达式的类型。

    否则,无法确定表达式类型,并出现编译时错误。

    【讨论】:

    • 不能比语言规范更好:)
    • 谢谢,你能把你找到的链接贴出来吗?我检查了 msdn 并没有找到这个。
    • @NominSim:为您提供了链接。
    【解决方案2】:

    我的简短总结:

      var x = c ? a : b;
    

    编译器将尝试b 是否可转换为a 的类型,否则如果a 可转换为b 的类型。当两者都不可能时,就会出现错误。

    但是在

     uint value = (someBool) ? 0 : 1;
    

    三元运算符只返回intab 都是整数)。

    在确定类型时考虑赋值左侧的变量。

    【讨论】:

      【解决方案3】:

      如果您不将任何数字转换为uint,编译器将假定三元运算符的结果是int,它不能隐式转换为uint

      【讨论】:

        猜你喜欢
        • 2012-10-28
        • 2010-10-25
        • 2019-10-08
        • 2017-07-12
        • 2023-03-21
        • 2011-12-17
        • 1970-01-01
        • 2015-12-09
        相关资源
        最近更新 更多