You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何System.Int16转System.Int32会抛出InvalidCastException?

问题解答

核心原因

.NET数据读取器(如Microsoft.Data.SqlClient.SqlDataReader)的GetInt32方法是严格匹配底层存储的CLR类型,而非根据值范围自动转换。SQL Server的smallint字段对应.NET的Int16类型,读取器从数据库获取到的对象是Int16实例。当调用GetInt32时,方法会直接尝试将该Int16对象强制转换为Int32——由于Int16和Int32是不同的值类型,CLR不允许这种直接强制转换,因此抛出System.InvalidCastException。

Copilot的误解在于混淆了「值范围兼容」和「CLR类型强制转换」的逻辑:虽然Int16的所有值都落在Int32的范围内,但这并不意味着CLR允许不同值类型对象的直接强制转换,而GetXXX方法的底层实现是直接类型转换,而非值的转换。

解决方法

  • 先通过GetInt16获取值,再显式转换为Int32:
    int value = (int)reader.GetInt16(mycolumn_ordinal_value);
    
  • 使用Convert.ToInt32处理自动类型转换:
    int value = Convert.ToInt32(reader[mycolumn_ordinal_value]);
    
  • 若使用ORM框架(如Dapper、EF Core),这类工具会自动处理数据库类型与.NET类型的兼容转换,无需手动调用GetXXX方法。

内容的提问来源于stack exchange,提问作者Soner from The Ottoman Empire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 08:24:55