为什么接口没有强类型?

时间:2010-01-08 19:10:01

标签: vb.net interface strong-typing

我有以下代码编译没有问题。当然,我在执行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

3 个答案:

答案 0 :(得分:13)

使用源代码文件顶部的Option Strict On来捕获这样的问题。您将收到编译时错误而不是运行时错误:

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

答案 1 :(得分:1)

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

  

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

答案 2 :(得分:0)

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

Public Class ClassA
  Implements IDoThingsC

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

End Class