gpt4 book ai didi

c# - 为什么 C# 三元运算符需要强制转换,而等效的 if() 语句不需要?

转载 作者:行者123 更新时间:2023-11-30 19:52:58 25 4
gpt4 key购买 nike

我不明白为什么下面两个代码语句不等价:

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 中,我们将 literal int 分配给 byte。这是一个特殊的隐式转换,只允许字面量 int1;条件表达式不是文字。

我首选的修复方法是:

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

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

这使得条件 byte 的类型不再是 int


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

关于c# - 为什么 C# 三元运算符需要强制转换,而等效的 if() 语句不需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51837025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com