为什么C#三元运算符需要等效if()语句的强制转换?

Pat*_*ick 2 c# casting ternary-operator

我不明白为什么以下两个代码语句不相同:

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;
Run Code Online (Sandbox Code Playgroud)

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

Dam*_*ver 7

因为在第二种情况下,我们需要anaylze条件表达式的类型是什么第一.两个子表达式是byteint(在这种情况下是文字),因此该表达式的整体类型是int.在这一点上,它不是一个文字,它是一个普遍的表达.

然后,我们尝试分配这int_bytes[3]它只能接受byte,我们得到一个错误.

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

我首选的解决方法是:

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

(仅适用于可读性的换行符)

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


1在分析条件的类型时不考虑此转换,因为我们不需要它 - 我们总是允许隐式转换byte,int因此int条件表达式的最佳类型.