我偶然發現了一個非常有趣的行為,想問一下,是否有人可以解釋為什么以下內容沒有OverflowException
在 .NET 語言中拋出(使用 .NET 6 檢查):
var f = (float)int.MaxValue;
Console.WriteLine(f); // 2.147484E 09, totally fine so far
var i = (int)f;
Console.WriteLine(i); // -2147483648, which is negative, no OverflowException
所以,我知道轉換int.MaxValue
為float
不會是整數的精確表示,我也明白Int32
,由于浮點值在記憶體中的表示方式,將結果轉換回很可能與我之前的不同. 這一切都很好。
但我天真的期望是,像 C# 這樣經過深思熟慮的漂亮語言實際上會導致System.OverflowException
第二次轉換,顯然情況并非如此。
相比之下,撰寫如下內容確實已經給我們帶來了編譯時錯誤,盡管基本上是相同的(我知道,我知道,這是由編譯器檢查的,與 RT 行為沒有真正的關系):
int i = (int)(float)int.MaxValue;
// CS0221 Constant value '2.147484E 09' cannot be converted to a 'int' (use 'unchecked' syntax to override)
所以我的問題是:為什么 .NET RT 沒有在這里拋出例外?這是根據規范定義的行為嗎?我無法在ECMA 334中找到任何解釋這一發現的內容。相反,請查看“11.3.2 顯式數字轉換”一章:
對于從 float 或 double 到整數型別的轉換 [...],源運算元朝零四舍五入到最接近的整數值。如果這個整數值在目標型別的范圍內,那么這個值就是轉換的結果。否則,將引發 System.OverflowException。
我確信我不會是第一個遇到這種行為的人,但是我沒有在 SO 上找到任何解釋我的東西,而且我不相信這是一個 RT 錯誤,在 .NET 的歷史上從未發現過。
uj5u.com熱心網友回復:
您需要從專案屬性 -> 構建 -> 高級中手動啟用“檢查算術溢位”
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/493142.html
上一篇:С#如何在沒有大量建構式多載的情況下設定父級的欄位和屬性?
下一篇:在回傳之前初始化變數在c#中更快