Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 直接转换返回InvalidCastException_C#_Sql_Generics_Xamarin - Fatal编程技术网

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,但是如果已知它始终是一个装箱的长文本,那么是的。