C# 直接转换返回InvalidCastException
我有一个泛型返回类型的方法,它与我的C# 直接转换返回InvalidCastException,c#,sql,generics,xamarin,C#,Sql,Generics,Xamarin,我有一个泛型返回类型的方法,它与我的SQLite数据库一起工作: 公共静态T SelectScalar(字符串sql) { //一些代码。。。 var result=command.ExecuteScalar(); connection.Close(); 返回(T)结果; } 这样调用时:SqliteReader.SelectScalar(mysql)在返回行中引发的InvalidCastException。怎么了?我对泛型很陌生,请告诉我,怎么了?蒂亚 编辑 包含结果的屏幕截图内容: 显然,
SQLite
数据库一起工作:
公共静态T SelectScalar(字符串sql)
{
//一些代码。。。
var result=command.ExecuteScalar();
connection.Close();
返回(T)结果;
}
这样调用时:SqliteReader.SelectScalar(mysql)代码>在返回行中引发的InvalidCastException
。怎么了?我对泛型很陌生,请告诉我,怎么了?蒂亚
编辑
包含结果的屏幕截图
内容:
显然,该类型不能简单地转换为int
。根据这一点,这似乎是一个错误
IIRC您将获得一个SqInt32结构,它可以转换为Int32
在您的例子中,可能是一个SqInt64
struct。你需要转换它
return (T)Convert.ChangeType(result, typeof(T));
我还建议将泛型参数至少限制为结构:
public static T SelectScalar<T>(string sql) where T: struct
publicstatict选择标量(stringsql),其中T:struct
显然,该类型不能简单地转换为int
。根据这一点,这似乎是一个错误
IIRC您将获得一个SqInt32结构,它可以转换为Int32
在您的例子中,可能是一个SqInt64
struct。你需要转换它
return (T)Convert.ChangeType(result, typeof(T));
我还建议将泛型参数至少限制为结构:
public static T SelectScalar<T>(string sql) where T: struct
publicstatict选择标量(stringsql),其中T:struct
ExecuteScalar()
返回一个对象
,在本例中是一个装箱的长
如果将对象强制转换为int
,它将尝试取消装箱。。实际的int
。将long
转换为int
将是一种转换
一个适合这些特定台词的演员阵容是
潜在重复:ExecuteScalar()
返回一个对象,在本例中是一个装箱的长
如果将对象强制转换为int
,它将尝试取消装箱。。实际的int
。将long
转换为int
将是一种转换
一个适合这些特定台词的演员阵容是
潜在重复:异常消息应告诉您哪些类型不能铸造。请告诉我们它的值是什么,而不是它的类型。那么异常消息是否会告诉您:“无法将INT转换为INT”?或者它是否告诉您“不能将INT转换为INT”?您应该调用您的方法:SqliteReader.SelectScalar(mysql)代码>请发布异常消息,最好是调试器的屏幕截图,显示结果的内容。这将使它更容易帮助你“它是对象类型的。”显然不是。调试器显示long
异常消息应告诉您哪些类型不能强制转换。请告诉我们它的值是什么,而不是它的类型。那么异常消息是否会告诉您:“无法将INT转换为INT”?或者它是否告诉您“不能将INT转换为INT”?您应该调用您的方法:SqliteReader.SelectScalar(mysql)代码>请发布异常消息,最好是调试器的屏幕截图,显示结果的内容。这将使它更容易帮助你“它是对象类型的。”显然不是。调试器显示long
实际问题是因为取消装箱,无法同时执行取消装箱和强制转换/转换。取消装箱只会尝试取消装箱所要求的确切类型,因此(int)objectValue
希望装箱对象中有int
,而不是其他。实际装箱的值是否可以转换为整数根本没有考虑。@LasseVågsætherKarlsen是的,我昨天读了重复的建议。当我有时间的时候,我会改变答案,包括拳击部分。或者你用你的金锤,把这个问题作为重复题结束,实际上本杰明·波德松的答案是正确的。你应该接受它。因此,我可以删除我的文章,我们可以作为副本关闭这篇文章。虽然我倾向于Convert.ChangeType方法,或者Convert.ToInt32,但如果已知它始终是一个装箱长的,那么是的。实际问题是因为取消装箱,它不能同时执行取消装箱和强制转换/转换。取消装箱只会尝试取消装箱所要求的确切类型,因此(int)objectValue
希望装箱对象中有int
,而不是其他。实际装箱的值是否可以转换为整数根本没有考虑。@LasseVågsætherKarlsen是的,我昨天读了重复的建议。当我有时间的时候,我会改变答案,包括拳击部分。或者你用你的金锤,把这个问题作为重复题结束,实际上本杰明·波德松的答案是正确的。你应该接受它。因此,我可以删除我的文章,我们可以以副本的形式结束这篇文章。尽管我倾向于Convert.ChangeType方法,或者Convert.ToInt32,但是如果已知它始终是一个装箱的长文本,那么是的。