【问题标题】:Why does C# ternary operator require a cast that equivalent if() statement does not?为什么 C# 三元运算符需要一个等效的 if() 语句不需要的强制转换?
【发布时间】:2019-01-21 01:13:55
【问题描述】:

我不明白为什么下面两个代码语句不等价:

if( _hexColourString.Length >= 8 )
    _bytes[ 3 ] = byte.Parse( _hexColourString.Substring( start + 6, 2 ), NumberStyles.AllowHexSpecifier );
else
    _bytes[ 3 ] = 0x00;


_bytes[ 3 ] = ( _hexColourString.Length >= 8 ) ? byte.Parse( _hexColourString.Substring( start + 6, 2 ), NumberStyles.AllowHexSpecifier ) : 0x00;

第一个编译没有问题,而第二个说我需要将一个 int 转换为一个字节。修复它显然没有问题,但我想了解为什么需要演员表。

【问题讨论】:

    标签: c# casting ternary-operator


    【解决方案1】:

    因为在第二种情况下,我们首先需要分析条件表达式的类型是什么。这两个子表达式是byteint(在这种情况下是文字),所以这个表达式的整体类型是int。在这一点上,它不是文字,而是一般的表达方式。

    然后我们尝试将这个int 分配给只能接受byte_bytes[3],然后我们得到一个错误。

    在第一种情况下,我们分析两个单独的表达式并分别考虑两者的转换。在那里,在 else 中,我们将 literal int 分配给 byte。这是一种特殊的隐式转换,仅允许用于文字 int1;条件表达式不是文字。

    我的首选解决方法是:

    _bytes[ 3 ] = ( _hexColourString.Length >= 8 ) ?
         byte.Parse( _hexColourString.Substring( start + 6, 2 ),NumberStyles.AllowHexSpecifier)
       : (byte)0x00;
    

    (仅为可读性换行)

    这现在使条件byte 的类型而不是int


    1在分析条件类型时不考虑这种转换,因为我们不需要它 - 我们总是允许从 @987654334 进行隐式转换@ to int 所以int 是条件表达式的最佳类型。

    【讨论】:

    • 很好的解释!谢谢。
    猜你喜欢
    • 2017-10-26
    • 2012-04-12
    • 2019-02-08
    • 2012-09-10
    • 2021-03-19
    • 1970-01-01
    • 2017-11-21
    • 2021-07-09
    相关资源
    最近更新 更多