为什么我可以安全地转换为int而不是转换为int?

时间:2012-07-18 20:51:37

标签: c# winforms casting int

为什么这样做:

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;
}

...错误输出“对象未设置为对象的引用”?

6 个答案:

答案 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;
  • 如果它为null,则返回0

答案 3 :(得分:3)

前者要求TagIConvertable支持ToInt32方法。后者要求Tagint

答案 4 :(得分:1)

转换有许多重载,允许它尝试从各种数据类型转换,例如Convert.ToInt32(string)

  

将指定的数字字符串表示形式转换为等效的32位有符号整数。

您的代码可能是Convert可以处理的类型(例如字符串)。

答案 5 :(得分:1)

一个演员说:“将内存中代表这个东西的位解释为[无论如何](在这种情况下为int。)

转换说:“看,这个东西实际上在记忆中是非常不同的,但你知道如何把它变成我想要的东西,所以请这样做并返回结果”。