【问题标题】:Why are interfaces not strongly typed?为什么接口不是强类型的?
【发布时间】:2011-01-03 01:18:30
【问题描述】:

我有以下代码编译没有问题。当然,在执行Dim C As IDoThingsC = GetThing_C() 时,我得到了一个无效的强制转换异常。我错过了什么吗?你会想要返回一个不满足函数返回值接口要求的对象吗?

Public Class ClassA

  Public Sub DoThings_A()
    Debug.Print("Doing A things...")
  End Sub

End Class


Public Class ClassB
  Implements IDoThingsC

  Public Sub DoThings_B()
    Debug.Print("Doing B things...")
  End Sub

  Public Sub DoThings_C() Implements IDoThingsC.DoThings_C
    Debug.Print("Doing C things...")
  End Sub

End Class


Public Interface IDoThingsC

  Sub DoThings_C()

End Interface


Public Class aTest

  Public Sub Test()

    Dim C As IDoThingsC = GetThing_C()
    C.DoThings_C()

  End Sub


  Public Function GetThing_C() As IDoThingsC

    Dim Thing As ClassA = New ClassA
    Thing.DoThings_A()

    Return Thing

  End Function


End Class

【问题讨论】:

  • 我看不到它是如何编译的?我错过了什么吗?
  • 真的编译没有问题吗?我认为“GetThing_C”不会编译,因为它试图将 ClassA 实例作为 IDoThingsC 接口返回,但它没有实现。
  • 我就是这么想的。它在 Visual Studio 2005 和 Visual Studio 2010 Beta 2 中编译。

标签: vb.net interface strong-typing


【解决方案1】:

在源代码文件的顶部使用Option Strict On 来捕获此类问题。你会得到一个编译时错误而不是运行时错误:

error BC30512: Option Strict On disallows implicit conversions from 'ClassA' to 'IDoThingsC'.

【讨论】:

  • 是否可以仍然以这种乐观的方式编写 VB 代码?为什么这个还没有被删除?
  • 当然。更好的是——我在项目的编译选项中更改了 Option Strict 选项(这样我就不必将它添加到每个代码模块中)。
【解决方案2】:

取自http://msdn.microsoft.com/en-us/library/h5fsszz9(VS.80).aspx

在数据类型之间转换时, Visual Basic 编译器可以运行 在严格或宽松类型下 语义。 If 严格类型语义 有效,只是扩大 隐式允许转换, 并且必须缩小转换范围 明确的。在许可类型下 语义,你可以尝试所有 扩大和缩小转换 含蓄地。类型语义适用于 所有数据类型之间的转换, 包括对象类型。

【讨论】:

    【解决方案3】:

    Option Strict 将解决这个问题。但“ClassA”也没有实现任何接口。因此,将 A 类的定义更改为以下内容将解决您的问题:

    Public Class ClassA
      Implements IDoThingsC
    
      Public Sub DoThings_A()
        Debug.Print("Doing A things...")
      End Sub
    
    End Class
    

    【讨论】:

      猜你喜欢
      • 2019-12-23
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 2012-02-27
      • 2021-10-11
      • 1970-01-01
      相关资源
      最近更新 更多