3
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,它现在可以工作了。

4

2 回答 2

9

转换和强制转换(使用强制转换运算符、is运算符和as运算符)是两个不同的东西:

  • 转换是将一种类型更改为另一种类型。就像从一个stringInt64到一个Int32
  • 只能从基类型转换为继承类型。在这种情况下从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.
于 2013-05-18T20:03:23.563 回答
2

Convert.ToInt32调用IConvertible您传入的对象上的接口。对于像doubleand之类的类型BigInteger,这已实现并将对象转换int为您所期望的那样。

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

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
于 2013-05-18T20:06:27.640 回答