C# 为什么我可以安全地转换为int,但不能转换为int?
为什么这样做有效:C# 为什么我可以安全地转换为int,但不能转换为int?,c#,winforms,casting,int,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; //
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;
}
ComboBox cb=发送方作为ComboBox;
int validSelection=(int)cb.Tag;// 那是因为
cb.Tag
可能是一个字符串,而不是int
,一个不能直接转换为另一个Convert.ToInt32()
实际解析字符串
,并使用转换后的值创建一个新的int
强制转换仅尝试将一个类型的实例解释为另一个类型的实例。Convert有许多重载,允许它尝试从各种数据类型进行转换,例如
将数字的指定字符串表示形式转换为等效的32位有符号整数
您的标记可能属于Convert可以处理的类型(例如字符串)。装箱的值类型只能解除装箱为其实际类型,因此如果标记的值实际上不是int,则从对象的转换将失败。此外,如果标记
的值为null,则转换失败,因为值类型不能为null
另一方面,当您使用Convert.ToInt32
时,该方法会采取必要的步骤将值转换为Int32
:
- 如果它是一个字符串,解析它李>
- 如果它是一个
Int64
,请将其取消装箱到Int64,然后将其转换为Int32
李>
- 如果为null,则返回0
- 等
前者要求标签
具有支持toToInt32
方法的i可转换
。后者要求Tag
必须是int
1)Convert.ToInt32(null)
始终返回0,如前所述
2) 不能将null
强制转换为int
,因为int
表示一个数字。可为空的int(int?
)允许为空值。一个cast说:“将内存中表示这个东西的位解释为[任何](int
)
转换说:“看,这个东西实际上在内存中是非常不同的,但是你知道如何将它转换成我想要的,所以请这样做并返回结果“标记的实际类型是什么?@andrischneider您将标记设置为什么?标记是对象。发送方实际上是组合框吗?是的,发送方是组合框。我正在将他们的SelectedIndex分配给他们自己的Tag属性。实际上,cb.Tag被声明为对象
(但它可能是OP中的一个字符串)。SelectedIndex在我看来像一个int,但可能不是:comboBoxPlatypusID.Tag=ComboxPlatyPusid.SelectedIndex@Clay,现在我很困惑,既然在。。。嗯,SelectedIndex
本身?@Frederic:如果用户试图在表单处于“只读状态”时更改组合框的SelectedIndex,我将使用它将组合框的SelectedIndex设置回其原始SelectedIndex。设置SelectedIndex时,我将标记值设置为相同的值。这适用于表单处于“只读”状态时—仅查看数据库中的现有值。因为同一个表单有时也可以作为可编辑表单使用,所以它会被设置为不同的状态……好吧,你可能已经明白了。@Clay,是的,我想现在更清楚了。我建议您寻找那些没有将标记设置为SelectedIndex
的代码路径,但之后仍然在问题中练习代码。在这种情况下,您将把null
强制转换为int
(Tag
是对象,如果未赋值,则默认为null
),这将解释NullReferenceException
,正如其他人在回答中解释的那样。以及语法(typename)值
执行强制转换和转换。