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