问题是你不cast an object
to an int
,你正在尝试unbox an int.
该对象确实必须是 int。它不能只是任何可以的东西转换的到一个整数。
所以区别在于:
int a = (int)obj;
确实需要obj
成为盒装的int
,没有别的,而这个:
int a = Convert.ToInt32(obj);
将执行ToInt32
方法将尝试弄清楚到底发生了什么并做正确的事情。
这里的“正确的事情”是确保有问题的对象实现IConvertible https://msdn.microsoft.com/en-us/library/system.iconvertible(v=vs.110).aspx并打电话IConvertible.ToInt32 https://msdn.microsoft.com/en-us/library/system.iconvertible.touint32(v=vs.110).aspx,从参考来源 https://referencesource.microsoft.com/#mscorlib/system/convert.cs,1024:
public static int ToInt32(object value) {
return value == null? 0: ((IConvertible)value).ToInt32(null);
}
你可以在上面看到拆箱尝试罗斯林 http://tryroslyn.azurewebsites.net/#f:>ilr/K4Zwlgdg5gBAygTxAFwKYFsDcAoADsAIwBswBjGUogQxBBgGEYBvbGNmfYsmANwHswAExgBZABQBKZq3ay+BAFapSyGPIUwAvDACMABhyzZkVWC0wxJiesPsAvtjtA==:
IL_0007: unbox.any [mscorlib]System.Int32
结论:您尝试拆箱的对象不是int
,但它可以转换为int
.