首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> .NET 實例教學

.NET 整數型別算術運算隱性轉型陷阱

     編輯:.NET 實例教學

現象重現

以下代碼在 Visual Studio 2005+ 編譯失敗:

sbyte sba = 1, sbb = 2, sbv;
sbv = sba + sbb; // 錯誤:無法將 int 隱含轉換為 sbyte

byte ba = 1, bb = 2, bv;
bv = ba + bb; // 錯誤:同上

short sa = 1, sb = 2, sv;
sv = sa + sb; // 錯誤:同上

ushort usa = 1, usb = 2, usv;
usv = usa + usb; // 錯誤:同上

根本原因

C# 規範:所有整數運算(+ - * / % 等)至少以 int 精度執行。sbyte、byte、short、ushort 運算前會隱性提升為 int,結果型別為 int,無法隱含指派回較小型別。

正確寫法

// 必須明確轉型
sbv = (sbyte)(sba + sbb);
bv = (byte)(ba + bb);
sv = (short)(sa + sb);
usv = (ushort)(usa + usb);

溢位風險與檢查

  • 轉型可能截斷高位元,導致邏輯錯誤(如 200 + 100 = 300 轉 byte 變 44)。
  • 建議搭配 checked 區塊或 checked 編譯選項(/checked+)在執行期擲出 OverflowException。
checked {
    bv = (byte)(ba + bb); // 溢位時拋出例外
}

最佳實務

  1. 預設使用 int / long 進行運算,僅在儲存/傳輸時轉為較小型別。
  2. 需高效能大量陣列運算時,可用 System.Numerics.Vector<T> 或 Span<T> 搭配 checked。
  3. 程式碼分析規則 CA2233 / CA2234 可偵測隱性縮小轉換。

理解型別提升規則,避免運行時神秘 Bug,寫出更健壯的 .NET 代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved