Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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# 为什么';转换为32';和';as int?&x27;工作方式不同?_C#_Sql - Fatal编程技术网

C# 为什么';转换为32';和';as int?&x27;工作方式不同?

C# 为什么';转换为32';和';as int?&x27;工作方式不同?,c#,sql,C#,Sql,在这种情况下,我必须使用第二种方法,因为myCommand.ExecuteScalar()可以返回DBNull。但是为什么第二种方法返回的结果与Convert.ToInt32不同呢 编辑:谢谢大家。已将类型更改为Int64,现在可以工作。转换和强制转换(使用强制转换操作符,是操作符和作为操作符)是两件不同的事情: Convert正在将一种类型更改为另一种类型。例如从字符串或Int64到Int32 只能从基类型转换为继承类型。在本例中,从object到Int32。对象必须包含Int32才能成功。

在这种情况下,我必须使用第二种方法,因为myCommand.ExecuteScalar()可以返回
DBNull
。但是为什么第二种方法返回的结果与
Convert.ToInt32
不同呢

编辑:谢谢大家。已将类型更改为Int64,现在可以工作。

转换和强制转换(使用强制转换操作符,
操作符和
作为
操作符)是两件不同的事情:

  • Convert正在将一种类型更改为另一种类型。例如从
    字符串
    Int64
    Int32
  • 只能从基类型转换为继承类型。在本例中,从
    object
    Int32
    对象必须包含
    Int32
    才能成功。在您的情况下,它不会,强制转换将返回
    null
代码:

Convert.ToInt32(myCommand.ExecuteScalar()); // Returns 100, because myCommand is a SQL command that gets a non-null BigInt cell
myCommand.ExecuteScalar() as int? ?? 0; //Returns 0 even when myCommand is SQL command that gets a non-null BigInt cell
在传入的对象上调用接口。对于像
double
biginger
这样的类型,这是实现的,并将对象转换为您期望的
int

as
关键字执行强制转换;如果强制转换失败,它将返回null。仅当对象已经是
int
,而不仅仅是可以转换为
int
的类型时,这才有效。例如

Int64 l = 100;
object o = l;
Int32 i1 = o as Int32? ?? 0; // Cast fails, so "as" will return 0. "??" will make it 0.
Int32 i2 = Convert.ToInt32(o); // The Int32 inside the object will be converted into an Int32 and will return 100.

强制转换不返回null,而是抛出异常。
as
运算符捕获该异常,然后返回
default(typeRequested)
,对于引用类型,它是
null
,对于值类型,它可以依赖。实现
IConvertible
的类型或带有
运算符的
重载可以通过其他方式强制转换。@newStack:Correct。。。但我并没有试图解释演员阵容、
之间的区别。简言之,我试图解释cast操作符和转换操作符之间的区别。公平地说,我在那里太迂腐了@newStackExchangeInstance您是对的,但只有在您非常学究的情况下:
o as int
无效,错误是:“as运算符必须与引用类型或可空类型一起使用”,因此
as
不能返回
default(int)
,但它可以返回
default(int?
,这在技术上不是
null
,但被视为几乎完全像
null
一样,因为
永远不会执行表示更改转换:
double d = 1.0;
object o = d;
int? i1 = o as int?; // results in null
int i2 = (int)d; // works
int i3 = Convert.ToInt32(o); //works
int i4 = Convert.ToInt32(d); //works
int i5 = (int)o; // throws an exception at run time