Convert.ToInt32'和'作为int?'不同的工作
本文关键字:工作 作为 ToInt32 Convert int | 更新日期: 2023-09-27 18:14:10
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
不同呢?
转换和强制转换(使用强制转换操作符,is
操作符和as
操作符)是两件不同的事情:
- 转换将一种类型更改为另一种类型。比如从
string
或Int64
到Int32
。 - 类型转换只能从基类型转换到继承类型。在本例中,从
object
到Int32
。object
必须包含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.
Convert.ToInt32
调用传入对象的IConvertible
接口。对于像double
和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