我有这个方法:
private static Dossier PrepareDossier(List<List<object>> rawDossier)
{
return new Dossier((int)rawDossier[0][0]);
}
当我使用它时,我得到一个InvalidCastException
。但是,当我使用Convert.ToInt32(rawDossier[0][0])
时,它的工作正常。有什么问题?
答案 0 :(得分:13)
问题是你没有 object
到int
,你正在尝试取消装箱一个int。< / p>
该对象必须是一个int。它不能只是转换到int。
的任何东西所以区别在于:
int a = (int)obj;
真的需要obj
成为盒装int
,没有别的,而这个:
int a = Convert.ToInt32(obj);
将执行ToInt32
方法,该方法将试图找出真正发生的事情并做正确的事。
这里的“正确的事情”是确保有问题的对象实现IConvertible
并调用IConvertible.ToInt32
,这从reference source可见:
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
。
答案 1 :(得分:2)
我猜这是因为列表中的对象不是int。
Convert.ToInt32将转换其他非int类型以便工作。
检查传入方法的内容。
答案 2 :(得分:2)
当您尝试从int
取消装箱object
时,装箱的值应为int
,否则您会收到异常,而Convert.ToInt32
则使用IConvertible
盒装类型的实现将值转换为int。
例如,如果装箱的值是字符串"100"
,则取消装箱会抛出异常,但使用Convert.ToInt32
,内部使用int.Parse
。
Boxing and Unboxing (C# Programming Guide)
尝试取消对不兼容的值类型的引用进行取消导致 InvalidCastException。