4

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

3 回答 3

13

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

error BC30512: Option Strict On disallows implicit conversions from 'ClassA' to 'IDoThingsC'.
于 2010-01-08T19:18:42.427 回答
1

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

在数据类型之间进行转换时,Visual Basic 编译器可以在严格或宽松的类型语义下运行。如果严格类型语义生效,则只允许隐式扩大转换,而缩小转换必须是显式的。在许可类型语义下,您可以隐式地尝试所有扩大和缩小转换。类型语义适用于所有数据类型之间的转换,包括对象类型。

于 2010-01-08T19:19:41.800 回答
0

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

Public Class ClassA
  Implements IDoThingsC

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

End Class
于 2010-01-08T22:42:45.823 回答