为什么 C# 三元运算符需要强制转换,而等效的 if() 语句不需要?
Why does C# ternary operator require a cast that equivalent if() statement does not?
我不明白为什么下面两个代码语句不等价:
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 转换为一个字节。修复它显然没问题,但我想了解为什么需要强制转换。
因为第二种情况,我们需要先分析条件表达式的类型是什么。这两个子表达式是 byte
或 int
(在本例中是文字),因此该表达式的整体类型是 int
。此时它不是文字,它是一个通用表达式。
然后我们尝试将此 int
分配给只能接受 byte
的 _bytes[3]
,但出现错误。
在第一种情况下,我们分析了两个单独的表达式并分别考虑了两者的转换。在那里,在 else
中,我们将 文字 int
赋值给 byte
。这是一个特殊的隐式转换,只允许文字 int
1;条件表达式不是文字。
我的首选修复方法是:
_bytes[ 3 ] = ( _hexColourString.Length >= 8 ) ?
byte.Parse( _hexColourString.Substring( start + 6, 2 ),NumberStyles.AllowHexSpecifier)
: (byte)0x00;
(换行只是为了便于阅读)
现在这使得条件类型 byte
而不是 int
。
1分析条件类型时不考虑此转换,因为我们不需要它 - 我们 总是 允许从 byte
到 int
的隐式转换,因此 int
是条件表达式的最佳类型。
我不明白为什么下面两个代码语句不等价:
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 转换为一个字节。修复它显然没问题,但我想了解为什么需要强制转换。
因为第二种情况,我们需要先分析条件表达式的类型是什么。这两个子表达式是 byte
或 int
(在本例中是文字),因此该表达式的整体类型是 int
。此时它不是文字,它是一个通用表达式。
然后我们尝试将此 int
分配给只能接受 byte
的 _bytes[3]
,但出现错误。
在第一种情况下,我们分析了两个单独的表达式并分别考虑了两者的转换。在那里,在 else
中,我们将 文字 int
赋值给 byte
。这是一个特殊的隐式转换,只允许文字 int
1;条件表达式不是文字。
我的首选修复方法是:
_bytes[ 3 ] = ( _hexColourString.Length >= 8 ) ?
byte.Parse( _hexColourString.Substring( start + 6, 2 ),NumberStyles.AllowHexSpecifier)
: (byte)0x00;
(换行只是为了便于阅读)
现在这使得条件类型 byte
而不是 int
。
1分析条件类型时不考虑此转换,因为我们不需要它 - 我们 总是 允许从 byte
到 int
的隐式转换,因此 int
是条件表达式的最佳类型。