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

时间:2018-08-14 08:29:59

标签: 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;

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

1 个答案:

答案 0 :(得分:7)

因为在第二种情况下,我们需要分析条件表达式的类型是 first 。两个子表达式是byteint(在这种情况下为文字),因此此表达式的整体类型为int。这不是一个字面意思,而是一个通用表达式。

然后我们尝试将此int分配给只能接受_bytes[3]的{​​{1}},我们会收到错误消息。

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

我的首选解决方法是:

int

(仅可读性的换行符)

现在,这将使条件_bytes[ 3 ] = ( _hexColourString.Length >= 8 ) ? byte.Parse( _hexColourString.Substring( start + 6, 2 ),NumberStyles.AllowHexSpecifier) : (byte)0x00; 而不是byte的类型。


1 分析条件的类型时不考虑此转换,因为我们不需要它-我们始终允许从{{ 1}}到int,因此byte是条件表达式的最佳类型。