![](/img/trans.png)
[英]Confused by Boxing. Casting -1 to Int64 throws InvalidCastException
[英]Casting object to int throws InvalidCastException in C#
我有这个方法:
private static Dossier PrepareDossier(List<List<object>> rawDossier)
{
return new Dossier((int)rawDossier[0][0]);
}
当我使用它时,我得到一个InvalidCastException
。 但是,当我使用Convert.ToInt32(rawDossier[0][0])
它工作正常。 问题是什么?
问题是你没有将 object
强制转换为int
,而是试图取消对int的取消 。
该对象必须是一个int。 它不能只是任何可以转换为int的东西。
所以区别在于:
int a = (int)obj;
真的需要obj
成为盒装int
,没有别的,而这个:
int a = Convert.ToInt32(obj);
将执行ToInt32
方法,该方法将试图找出真正发生的事情并做正确的事情。
这里的“正确的事情”是确保有问题的对象实现IConvertible
并调用IConvertible.ToInt32
,从参考资料中可以看出:
public static int ToInt32(object value) {
return value == null? 0: ((IConvertible)value).ToInt32(null);
}
你可以在try roslyn上看到拆箱:
IL_0007: unbox.any [mscorlib]System.Int32
结论 :您尝试取消装箱的对象不是int
,但它可以转换为int
。
我猜这是因为列表中的对象不是int。
Convert.ToInt32将转换其他非int类型以便工作。
检查传入方法的内容。
当您尝试从object
取消装入int
,装箱的值应为int
,否则您将收到异常,而Convert.ToInt32
使用盒装类型的IConvertible
实现将值转换为int。
例如,如果装箱的值是字符串"100"
,则取消装箱将引发异常,但使用Convert.ToInt32
,内部使用int.Parse
。
尝试取消对不兼容的值类型的引用的unbox会导致InvalidCastException。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.