以下代碼在 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); // 溢位時拋出例外
}
int / long 進行運算,僅在儲存/傳輸時轉為較小型別。System.Numerics.Vector<T> 或 Span<T> 搭配 checked。理解型別提升規則,避免運行時神秘 Bug,寫出更健壯的 .NET 代碼。