我不明白为什么以下两个代码语句不相等:
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强制转换为字节。修复它显然没问题,但是我想了解为什么需要强制转换。
答案 0 :(得分:7)
因为在第二种情况下,我们需要分析条件表达式的类型是 first 。两个子表达式是byte
或int
(在这种情况下为文字),因此此表达式的整体类型为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
是条件表达式的最佳类型。