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

时间:2016-09-12 11:06:52

标签: c#

Convert.ToInt16(row [" 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. 

1 个答案:

答案 0 :(得分:1)

行中提供的值为零时,或者当行中的值不能转换为row["INT"] as Int16?时,

null会返回Int16(对于"zero"例如,如果内容为Convert.ToInt16(null))。 zero现在返回(Int16) myValue

然而,当演员失败时,“直接”演员Nullable<int>会抛出异常。有关详细信息,请参阅here

无论如何,在您的代码中,您试图将Int16投射到int这显然是不可能的。但是,您可以使用,其中 Int16 result = ((int?)row["INT"]).Value;

false

编辑:一个更好的方法是使用TryParse,如果解析失败但不返回Int16 result; if (Int16.TryParse(row["INT"].ToString(), out result)) { // do something with result } ,则不会抛出异常:

In [36]:
import dateparser
t="""Date-heure
Vendredi 03 novembre 10.0
Vendredi 03 novembre 5.0
Vendredi 03 novembre 18.0
Vendredi 03 novembre 24.0
Samedi 04 novembre 1.0
Samedi 04 novembre 2.0
Samedi 04 novembre 4.0
Samedi 04 novembre 5.0
Samedi 04 novembre 7.0
Samedi 04 novembre 13.0
Samedi 04 novembre 21.0
Vendredi 20 avril 1.0
Dimanche 05 novembre 2.0
Dimanche 05 novembre 8.0"""
df = pd.read_csv(io.StringIO(t))
df['date-time'] = df['Date-heure'].str.split().str[:-1].str.join(' ').apply(dateparser.parse) + pd.TimedeltaIndex((df['Date-heure'].str.rsplit().str[-1]).astype(float), unit='H')
df

Out[36]:
                   Date-heure           date-time
0   Vendredi 03 novembre 10.0 2016-11-03 10:00:00
1    Vendredi 03 novembre 5.0 2016-11-03 05:00:00
2   Vendredi 03 novembre 18.0 2016-11-03 18:00:00
3   Vendredi 03 novembre 24.0 2016-11-04 00:00:00
4      Samedi 04 novembre 1.0 2016-11-04 01:00:00
5      Samedi 04 novembre 2.0 2016-11-04 02:00:00
6      Samedi 04 novembre 4.0 2016-11-04 04:00:00
7      Samedi 04 novembre 5.0 2016-11-04 05:00:00
8      Samedi 04 novembre 7.0 2016-11-04 07:00:00
9     Samedi 04 novembre 13.0 2016-11-04 13:00:00
10    Samedi 04 novembre 21.0 2016-11-04 21:00:00
11      Vendredi 20 avril 1.0 2016-04-20 01:00:00
12   Dimanche 05 novembre 2.0 2016-11-05 02:00:00
13   Dimanche 05 novembre 8.0 2016-11-05 08:00:00