在 C# 中将对象转换为 int 会引发 InvalidCastException

2024-02-07

我有这个方法:

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

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


问题是你不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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中将对象转换为 int 会引发 InvalidCastException 的相关文章

随机推荐

  • 无法为 nlb 提供静态 IP

    我很难使用入口控制器将其与 NLB 一起使用 https kubernetes github io ingress nginx deploy network load balancer nlb https kubernetes github
  • JNI for C 使用 Swig 和函数指针回调的问题

    我们在 java 中加载的库之一中有一个 C 函数 它接受一个函数指针 函数定义如下 typedef char int8 typedef unsigned short uint16 uint32 poll broadcasts void p
  • 在 C++ 0x 中打开枚举类

    C 0x 中新的 枚举类 声明是否允许打开新奇的枚举 我问的是标准的内容 而不是编译器的支持 来自 n3242 草案 6 4 2 switch 语句 stmt switch 2 条件应为整型 枚举类型或单个非显式的类类型 存在到整型或枚举类
  • 如何将一个 HashSet 的所有值插入到另一个 HashSet 中?

    我有两个HashSet
  • 使用 VBA 将文件夹导入 Excel (FileDialogFolderPicker)

    我使用下一个代码来从某个路径选择一个文件夹并导入其中的所有文件 Function GetFolder Dim fd As FileDialog Set fd Application FileDialog msoFileDialogFolde
  • 在 Java 中将两个整数相除得到 0 或 100?

    我试图除两个整数并乘以 100 但它始终只给出 0 或 100 有人可以帮助我吗 int x a b 100 如果 a 是 500 b 是 1000 它会给我 0 唯一一次它会给我 100 是如果 a gt b 我怎样才能解决这个问题 Th
  • 无法打开本地文件 - Chrome:不允许加载本地资源

    测试浏览器 Chrome 版本 52 0 2743 116 这是一个简单的 JavaScript 用于从本地打开图像文件 如 C 002 jpg function run var URL file C 002 jpg window open
  • JasperReports API 中的 FileResolver 被什么替代?

    我们的一个软件实用程序使用一个类来实现net sf jasperreports engine util FileResolver加载驻留在与报表相关的路径或要通过专有文件服务器协议加载的报表元素 例如图像 从最新版本 6 6 0 开始 我看
  • Android NDK 未定义引用

    我正在尝试实现代码 here https github com webjb myrobot 当尝试编译它时 我收到以下错误 Error 339 undefined reference to ANativeWindow fromSurface
  • 单向一对多关系的 NHibernate 配置

    我正在尝试建立如下关系 每个Master项目有一个或多个Detail items public class Detail public virtual Guid DetailId get set public virtual string
  • .net core如何将内容范围添加到标题

    我没有找到如何将 Content Range 添加到我的 odata 请求的标头中 我的 api 需要这样的格式来进行分页 Content Range posts 0 24 319 我能找到的最接近的是 HTTP 字节范围支持 从这里 ht
  • 如何使用 htaccess 仅在某些页面上启用 https?

    我有一个电子商务网站 我想仅在位于以下位置的网站的电子商务部分启用 https https mysite com buy https mysite com buy 由于我的页面上的所有链接都是相对的 当有人访问时http mysite co
  • python组合26个不同时间戳和相同列的数据帧

    美国的一个数据库接收来自世界各地的一日信息 csv格式 有15天的数据 来自26个地方 总共 15x26 390 个数据帧 此外 还有26个地方有共同的参考数据框 现在 我想将 390 1 个参考数据帧合并为一个 我在这里给出了我的问题的示
  • 如何返回列表切片的最大元素

    我想最大限度地简化这个功能 我该怎么办 def eleMax items start 0 end None if end is None end len items return max items start end 我想到了 def e
  • 是否可以从mysql中的别名中进行选择?

    我创建了一个名为的表别名tbl 我想从中选择 但我无法做到这一点 我知道我的代码不正确也不优化 但我只是测试 MySQLCASE select case when exists select username from tbl then U
  • 非聚集索引中的行定位器

    我正在读关于Non Clustered Index其中说 Nonclusteredindex 仅包含指向实际数据行的索引列和行定位器中的值 而不包含数据行本身 这意味着查询引擎必须采取额外的步骤才能找到实际数据 Query 我不清楚Row
  • iOS:同步相机帧和运动数据

    我正在尝试从相机捕获帧和相关的运动数据 为了同步 我使用时间戳 视频和动作被写入文件然后进行处理 在这个过程中 我可以计算每个视频的运动帧偏移 事实证明 相同时间戳的运动数据和视频数据彼此偏移不同的时间 从 0 2 秒到 0 3 秒不等 该
  • 事件驱动编程是如何实现的?

    我正在研究twisted 和node js 框架是如何工作的 我是 试图准确理解操作系统如何支持 I O 使用回调的操作 我知道这很好 因为我们需要更少的线程 因为我们不需要 需要阻塞线程等待 I O 操作 但有些东西 I O 完成后必须调
  • 计算数字数组的可能排列

    我有一个带有数字 0 1 2 3 的 NSArray 计算 4 的阶乘 数组的计数 我有 24 种可能的排列 0 1 2 3 我想知道是否有一种方法可以计算所有这些可能的排列并将它们放在一个单独的数组中 例如 给定上面的数字 0 1 2 3
  • 在 C# 中将对象转换为 int 会引发 InvalidCastException

    我有这个方法 private static Dossier PrepareDossier List