【问题标题】:InvalidCastException on Passing Object as Nullable Int64 [duplicate]将对象作为 Nullable Int64 传递时出现 InvalidCastException [重复]
【发布时间】:2020-10-21 14:20:13
【问题描述】:

好的,所以我对编码并不陌生,这让我觉得非常愚蠢。也许有人可以解释为什么这会失败,因为通常 VB.Net 在这种类型(双关语)的事情上是直观和灵活的?

我有一个简单的例子,我想将一个整数值为 6 的对象集传递给一个可以为空的 Int64 参数的过程。我想这样做,因为我无法更改来自对象的传入值,它是一个类的属性,很可能什么都不是,因此使用了可为空的 Int64。

    Private Sub NullableParamTest(ByVal ID As Int64?)
        MsgBox(ID)
    End Sub

现在这样的简单示例将导致异常:

    Dim objTest As Object = 6
    NullableParamTest(objTest)

当对象被设置为整数并传递给具有 Int64 的过程时,为什么没有正确装箱?类型?如果我用 CInt(objTest) 包装 objTest 并首先对其进行转换,那很好,但至少在 VB 中我不需要这样做。我有可以选择将各种 ID 作为 Int64 的日志记录方法?但源是这个 Object 属性导致它失败......即使它们设置了完全有效的 Int64s。

我想避免使用整个 Optional...Int64 = Nothing,因为这并没有真正将其设置为空,因为我的 ID 永远不会为零,但它并不是真正发生的事情。

【问题讨论】:

  • Dim objTest As Object = 6&.
  • @GSerg 谢谢,我相信确实如此,尤其是该帖子的答案中的链接。编译器无法即时处理转换似乎有点奇怪,我希望不必强制转换/转换,看起来像使用 Int64 知道 0 无论如何都无效或将这些参数更改为 Object是我仅有的两个选择。还要感谢 6& 符号,我不记得在任何地方都见过它,而且效果也很好!

标签: vb.net


【解决方案1】:

感谢来自@GSerg 的 cmets,看来以下是找到here 的这个问题的答案:

装箱的值只能拆箱为完全相同类型的变量。

它链接到另一个将这种行为描述为与性能相关的答案。简而言之,您必须先转换/转换对象中的值,然后再传递它。

在我的情况下,我传递的 ID 值永远不会为 0,因此使用常规 Int64 并检查它是否无效,否则使用 Object 作为类型是替代方法,因为它可以将所有方法调用包装成六个以上转换将是可怕的。

@GSerg 的另一条评论提到了在值之后添加 & 以使其成为显式 Int64 的符号,也允许它在这种情况下工作。请注意,以这种方式将值转换为 Int32,理论上可行(因为它适合 Int64 空间),实际上并不是因为我的评论的第一部分必须将其拆箱为完全相同的值输入参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多