繁体   English   中英

将对象强制转换为int会在C#中抛出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

拳击和拆箱(C#编程指南)

尝试取消对不兼容的值类型的引用的unbox会导致InvalidCastException。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM