将对象强制转换为int会在C#中抛出InvalidCastException

时间:2016-10-06 08:45:36

标签: c# casting unboxing

我有这个方法:

private static Dossier PrepareDossier(List<List<object>> rawDossier)
{
    return new Dossier((int)rawDossier[0][0]);
}

当我使用它时,我得到一个InvalidCastException。但是,当我使用Convert.ToInt32(rawDossier[0][0])时,它的工作正常。有什么问题?

3 个答案:

答案 0 :(得分:13)

问题是你没有 objectint,你正在尝试取消装箱一个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。