直接转换返回InvalidCastException

时间:2019-04-09 09:11:38

标签: c# sql generics xamarin

我有一种方法可以与我的SQLite数据库一起使用的泛型返回类型:

    public static T SelectScalar<T>(string sql)
    {
        // some code...
        var result = command.ExecuteScalar();
        connection.Close();
        return (T)result;
    }

在这样调用时:SqliteReader.SelectScalar<int>(mysql); InvalidCastException在返回行上引发。它出什么问题了?我对泛型很陌生,请告诉我,这是怎么回事? TIA。

编辑 包含result内容的屏幕截图: cssEscape(value)

2 个答案:

答案 0 :(得分:1)

显然,类型BigInt不能简单地强制转换为int。根据此post,它似乎是

  

IIRC,您将获得一个可转换为Int32的SqInt32结构

在您的情况下,可能是SqInt64结构。您需要对其进行转换

return (T)Convert.ChangeType(result, typeof(T));

我还建议将通用参数至少限制为结构:

public static T SelectScalar<T>(string sql) where T: struct

答案 1 :(得分:1)

ExecuteScalar()返回一个object,在这种情况下是一个装箱的long

如果将对象投射到int,它将尝试对实际的int进行拆箱。将long投射到int将会是一种转换。

适用于这些特定行的演员表(但..对您没有帮助)是

return (T)(long)result;

可能的重复项:https://stackoverflow.com/a/3541712/59492