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转换为一个字节.修复它显然没问题,但我想理解为什么演员是必要的.
因为在第二种情况下,我们需要anaylze条件表达式的类型是什么第一.两个子表达式是byte或int(在这种情况下是文字),因此该表达式的整体类型是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条件表达式的最佳类型.