C# 里把值收成 int,常见三条路:(int)、int.Parse / int.TryParse、Convert.ToInt32。能转什么、遇到 null 和小数时怎么走,不一样。
各自吃什么
(int):只能是数字类型,如float、double、int、uint。int.Parse/int.TryParse:只能是整型的十进制字符串(123、"-1")。"1.5"对Parse会抛格式异常,TryParse返回false,out 为 0。Convert.ToInt32:更宽,数字、bool、DateTime、字符串都能试。
null
(int) 和 int.Parse 都不接受 null,直接异常。
Convert.ToInt32(null) 返回 0。它先判断空,空就 0,否则再走类似 Parse 的路径。
int.TryParse 遇到解析失败(包括不合适的输入)返回 false,out 为 0,不抛。
小数怎么取整
只有 (int) 和 Convert.ToInt32 能从浮点转到 int。
(int)1.499→ 1,(int)1.5→ 1,截掉小数。Convert.ToInt32(1.499d)→ 1,Convert.ToInt32(1.5d)→ 2,按四舍五入(银行家舍入在 .NET 里对中点还有细节,但 1.5 这类常见例子是进位)。
不要用 Parse 去吃 "1.5",那不是整型字符串。
溢出
把超出 Int32 范围的值转进来时,Convert.ToInt32 和 int.Parse 会抛溢出。(int) 强制转换不抛,结果是截断后的值,可能完全对不上原意(例如得到 -1 这类表象),所以更危险。
怎么选
- 已经是数字类型,只想截整数部分:
(int)。 - 确定是整型字符串,失败就该抛或分支:
Parse/TryParse。 - 类型杂、还可能是
null:Convert.ToInt32,并清楚「空会变成 0」。