从int32强制转换为int16时,指定的强制转换无效
本文关键字:转换 无效 int16 int32 | 更新日期: 2023-09-27 18:06:49
转换。ToInt16(行["INT"]为Int16?(;返回0和(Int16(行["INT"];引发异常指定的强制转换无效。
private DataTable GetTableWithValue()
{
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[] {
new DataColumn("INT", typeof(Int32)),
new DataColumn("STRING", typeof(string )),
new DataColumn("DATETIME", typeof(DateTime )),
new DataColumn("BOOLEAN", typeof(bool)),
});
dt.Rows.Add(dt.NewRow());
dt.Rows[0][0] = 10;
dt.Rows[0][1] = "Babu";
dt.Rows[0][2] = DateTime.Now;
dt.Rows[0][3] = true;
return dt;
}
dt = GetTableWithValue();
row = dt.Rows[0];
int? INT = (row["INT"] as int?); //10
Int16? INT16 = Convert.ToInt16(row["INT"] as Int16?); //0
Int16 = (Int16)row["INT"]; //Specified cast is not valid.
row["INT"] as Int16?
在行中提供的值为零时,或者当该行中的值不能转换为Int16
时(例如,如果内容为"zero"
(,返回null
。Convert.ToInt16(null)
现在返回zero
。
但是,当强制转换失败时,"直接"强制转换(Int16) myValue
会引发异常。有关的更多详细信息,请参阅此处
无论如何,在您的代码中,您试图将Nullable<int>
强制转换为Int16
,这显然是不可能的。但是,您可以使用可为null的值,是int
:
Int16 result = ((int?)row["INT"]).Value;
编辑:一个更好的方法是使用TryParse
,如果解析失败,它不会抛出异常,而是简单地返回false
:
Int16 result;
if (Int16.TryParse(row["INT"].ToString(), out result))
{
// do something with result
}