为什么这样做:
ComboBox cb = sender as ComboBox;
int validSelection = Convert.ToInt32(cb.Tag);
if (cb.SelectedIndex != validSelection) {
cb.SelectedIndex = validSelection;
}
......但是这个:
ComboBox cb = sender as ComboBox;
int validSelection = (int)cb.Tag; // <-- fails
if (cb.SelectedIndex != validSelection) {
cb.SelectedIndex = validSelection;
}
...错误输出“对象未设置为对象的引用”?
答案 0 :(得分:13)
那是因为a conversion is not the same thing as a cast。
cb.Tag
可能是string
,而不是int
,其中一个不能直接转换为另一个。 Convert.ToInt32()
实际解析string
并使用转换后的值创建新的int
。
强制转换仅尝试将类型的实例解释为另一种类型的实例。
答案 1 :(得分:7)
1)Convert.ToInt32(null)
总是返回0,如in the documentation
2)您无法将null
投射到int
,因为int
代表一个数字。 Nullable int(int?
)允许空值。
答案 2 :(得分:4)
盒装值类型只能取消装箱到实际类型,因此如果Tag
的值实际上不是int,则object
的强制转换失败。此外,如果Tag
的值为null,则转换失败,因为值类型不能为null。
另一方面,当您使用Convert.ToInt32
时,该方法会采取将值转换为Int32
所需的任何步骤:
Int64
,请将其解包到Int64,然后将其转换为Int32
; 答案 3 :(得分:3)
前者要求Tag
有IConvertable
支持ToInt32
方法。后者要求Tag
为int
。
答案 4 :(得分:1)
转换有许多重载,允许它尝试从各种数据类型转换,例如Convert.ToInt32(string)
将指定的数字字符串表示形式转换为等效的32位有符号整数。
您的代码可能是Convert可以处理的类型(例如字符串)。
答案 5 :(得分:1)
一个演员说:“将内存中代表这个东西的位解释为[无论如何](在这种情况下为int
。)
转换说:“看,这个东西实际上在记忆中是非常不同的,但你知道如何把它变成我想要的东西,所以请这样做并返回结果”。