C# 條件運算符(?:) 的隱式類型轉換限制
C# 的條件運算符(?:) 提供了一種簡潔的條件分支語法。但是,在隱式類型轉換方面,它有時會表現出異常行為。
考慮以下代碼片段:
<code class="language-csharp">bool aBoolValue; byte aByteValue; // 这段代码可以成功编译 if (aBoolValue) aByteValue = 1; else aByteValue = 0; // 这段代码编译失败,并出现错误:“无法将类型“int”隐式转换为“byte”。 aByteValue = aBoolValue ? 1 : 0;</code>
為什麼第一個代碼片段可以編譯,而第二個代碼片段卻失敗了呢?
C# 中類型推斷的作用
編譯器分析代碼時,會根據變量和表達式的使用上下文來確定它們的類型。這個過程稱為類型推斷。通常,類型推斷是從表達式向外推斷,而不是向內推斷。
在第一個代碼片段中,編譯器根據 if-else 語句每個分支上的賦值來推斷 aByteValue 的類型:aByteValue 被賦值為 1 或 0,它們都是字節。因此,編譯器推斷 aByteValue 是一個字節。
條件表達式的含義
條件運算符評估兩個表達式:結果表達式和備選表達式。條件表達式的類型是這兩個表達式中更通用的類型。
在第二個代碼片段中,結果表達式和備選表達式都計算為整數(分別為 1 和 0)。因此,編譯器推斷條件表達式的類型為 int。
轉換為兼容類型
由於條件表達式計算結果為 int,因此無法將其隱式轉換為 byte。要解決此問題,需要顯式地將表達式轉換為 byte,如下面的代碼所示:
<code class="language-csharp">aByteValue = aBoolValue ? (byte)1 : (byte)0;</code>
以上是為什麼 C# 的條件運算子 (?:) 有時會導致隱式型別轉換失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!