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 に答える