Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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# 为什么从short转换为int失败?_C#_Sql_Casting_Boxing - Fatal编程技术网

C# 为什么从short转换为int失败?

C# 为什么从short转换为int失败?,c#,sql,casting,boxing,C#,Sql,Casting,Boxing,我们有一些代码可以将Microsoft Access数据库中的数据归档到MS SQL Server数据库中。假设我们已经从Access表中填充了一个数据读取器,并且我们正在向SqlCommand添加一个参数以准备插入,那么我们的typecast失败了。代码如下: oSqlServerDbCmd_ForInsert.Parameters.AddWithValue("@Duration", (int) oReader["Duration"]); oReader中的字段实际上是一个访问整数

我们有一些代码可以将Microsoft Access数据库中的数据归档到MS SQL Server数据库中。假设我们已经从Access表中填充了一个数据读取器,并且我们正在向SqlCommand添加一个参数以准备插入,那么我们的typecast失败了。代码如下:

oSqlServerDbCmd_ForInsert.Parameters.AddWithValue("@Duration",
     (int) oReader["Duration"]);
oReader中的字段实际上是一个访问整数,在C#中是一个短字符。如果我们在这里做空,没有问题。但是,如果我们强制转换为int,代码将抛出InvalidCastException。我可能从以下方面误解了这一点:

存在从短到int、long、float、double或decimal的预定义隐式转换


…但听起来这应该行得通(我的推理是,如果定义了隐式转换,为什么显式类型转换不起作用?)。我意识到强制转换甚至是不必要的,因为AddWithValue接受一个对象,所以我们实际上已经从代码中删除了强制转换,但我希望看到一个解释,说明为什么这个强制转换会失败,以防我们将来遇到类似的情况。

您手中的就是一个实例。特别是在取消装箱时,只能取消装箱到最初装箱的值的类型;如果该类型是A,并且您要取消绑定到B,那么从A到B的隐式转换是否存在并不重要(取消绑定仍将失败)


请参阅Eric Lippert关于该主题的详细解释。

由于要取消装箱,您必须转换为非常特定的类型-问题是
oReader[“Duration”]
返回一个
对象
实例:

short myShort = 42;
object o = myShort;
int myInt = (int)o; //fails
如果您先转换为short,然后转换为int,则会成功:

(int) (short) oReader["Duration"]

+我总是忘记那件事<代码>对象o=(短)10;int i=(int)o失败。啊,这是有道理的。那么,如果我先将其转换为一个短字符,那么我可以将其转换为一个int而没有问题吗?Eric Lippert关于这方面的好文章这并不是对您问题的回答,但似乎您的
@Duration
参数应该具有数字数据类型,在这种情况下,您不希望在
AddWithValue
调用中使用字符串值。@phoog我编辑代码以删除该转换,因为这会分散您对这个问题的注意力。简而言之,字符串转换是在我们继承它时在代码中进行的。因为在我们更改源数据库中的数据类型之前它一直在工作,所以我们没有理由调查代码。一旦它被破坏了,我们深入研究,我们发现字符串转换是不必要的(尽管没有问题,信不信由你)。感谢反馈,+1…你们都回答了我的问题,所以我将不得不使用first mover。