我有一种方法可以与我的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)
答案 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;