【问题标题】:Calling a method on a Object says "disallows late binding"在对象上调用方法表示“不允许后期绑定”
【发布时间】:2014-06-11 15:13:01
【问题描述】:

我有一个名为 DtaDate 的调用,它存储一个整数“键”、一个字符串名称、一个日期字符串以及一个从该字符串创建的 Date 对象。

我有一些代码需要接受类似日期的对象。我希望用户能够传递任何日期,例如 - 我将从中提取信息的 Date 对象、另一个 DtaDate、其中包含日期的字符串,甚至是我将使用的键从集合中查找 DtaDate。

所以我有这个:

    Friend Sub New(NameIn As String, DateFormulaIn As String, Optional FromDateIn As Object = Nothing)
[stuff that works]
[check that we got a FromDateIn...]
            If TypeOf FromDateIn Is DtaDate Then
                fdk = FromDateIn.Key
                Ans.FromDate = fdk

VB 告诉我“Option Strict On 不允许后期绑定”。在其他情况下,字符串或整数是 TypeOf,我使用 CInt 或 CStr。但这是我第一次真正遇到强制转换是非基本类型的情况。有什么诀窍?

【问题讨论】:

  • FromDateIn 可以是 DtaDate 以外的任何其他内容吗?提示警告的是As Object

标签: vb.net casting


【解决方案1】:

您的签名定义了FromDateIn As Object。稍后,您尝试通过调用FromDateIn.Key 将其视为DtaDate。据编译器所知,FromDateIn 只是一个Object,并没有Key 属性,并且选项 strict 禁止后期绑定。

看起来您正在检查FromDateIn 的类型,然后根据该类型采取行动,因此您只需将FromDateIn 转换为DtaDate。有几种方法可以做到这一点。

fdk = CType(FromDateIn, DtaDate).Key
fdk = DirectCast(FromDateIn, DtaDate).Key
fdk = TryCast(FromDateIn, DtaDate).Key

DirectCast 将转换给定变量,如果它是给定类型,或者继承或实现它。

CType 做同样的事情,但也会检查是否存在从当前类型到指定类型的转换。这两个都会在失败时抛出InvalidCastException

TryCast 仅适用于引用类型,与DirectCast 类似,但在失败时返回Nothing 而不是抛出异常。

另一种选择是提供三个单独的构造函数,每个构造函数都接受一个强类型变量,例如

Friend Sub New(NameIn As String, DateFormulaIn As String)
  '...handle case where no date is provided
End Sub

Friend Sub New(NameIn As String, DateFormulaIn As String, FromDateIn As DateTime)
  '...handle case where a DateTime is passed in
End Sub

Friend Sub New(NameIn As String, DateFormulaIn As String, FromDateIn As DtaDate)
  '...handle case where a DtaDate is passed in
End Sub

Friend Sub New(NameIn As String, DateFormulaIn As String, FromDateIn As String)
  '...handle case where a string is passed in
End Sub

这会更有效,但也更安全,因为可以在编译时而不是在运行时检查传递给构造函数的类型。

【讨论】:

  • 最佳答案。我想我会选择选项 1 并使用 CType,因为它简化了代码。谢谢!
【解决方案2】:

我会使用 TryCast() 方法。如果它可以将源对象转换为指定的类型,那么它将,否则将其设置为 Nothing。

在 If 块中引用 DtaFromDate,它将 FromDateIn 转换为 DtaDate。

Friend Sub New(NameIn As String, DateFormulaIn As String, Optional FromDateIn As Object = Nothing)
[stuff that works]
[check that we got a FromDateIn...]

    Dim DtaFromDate As DtaDate
    TryCast(FromDateIn, DtaDate)
    If DtaFromDate IsNot Nothing Then
        fdk = DtaFromDate.Key
        Ans.FromDate = fdk

    End If

【讨论】:

  • TryCast 运算符仅适用于引用类型,因此这可能不起作用
  • OP有“调用”,没关系。不使用 TryCast() 的返回值是不行的,DtaFromDate 总是 Nothing。
猜你喜欢
  • 1970-01-01
  • 2012-09-04
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 2020-05-12
  • 2016-12-03
相关资源
最近更新 更多