为什么 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 转换为一个字节。修复它显然没问题,但我想了解为什么需要强制转换。

因为第二种情况,我们需要先分析条件表达式的类型是什么。这两个子表达式是 byteint(在本例中是文字),因此该表达式的整体类型是 int。此时它不是文字,它是一个通用表达式。

然后我们尝试将此 int 分配给只能接受 byte_bytes[3],但出现错误。

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

我的首选修复方法是:

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

(换行只是为了便于阅读)

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


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