从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. 

从int32强制转换为int16时,指定的强制转换无效

row["INT"] as Int16?行中提供的值为零时,或者当该行中的值不能转换为Int16时(例如,如果内容为"zero"(,返回nullConvert.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
}