为什么'Convert.ToInt32'和'as int?'工作不同?

时间:2013-05-18 20:00:06

标签: c# sql

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

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

编辑:谢谢大家。将类型更改为Int64,它现在正在运行。

2 个答案:

答案 0 :(得分:9)

转换和转换(使用强制转换运算符,is运算符和as运算符)是两回事:

  • 转换正在将一种类型更改为另一种类型。例如从stringInt64Int32
  • 只能从基类型转换为继承类型。在这种情况下,从objectInt32object必须包含Int32才能成功。在你的情况下它没有,演员表将返回null

在代码中:

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.

答案 1 :(得分:2)

Convert.ToInt32调用您传入的对象上的IConvertible接口。对于doubleBigInteger等类型,这是实现的,并将对象转换为{{1正如你所期待的那样。

int关键字执行转换;如果转换失败,则返回null。这仅在对象已经是as时才有效,而不仅仅是它是可以转换为int的类型。 E.g。

int