2012-01-06 5 views
1

私は、インターフェイスを使用して戦略デザインパターンを実装しようとしています。 しかし、いくつかのコードを開発しているうちに、私は奇妙なことに遭遇しました。 オブジェクトの型は設計時に検証されません。インターフェイスでの.NETタイプのチェック

次のコードを確認してください。 FooはIFooを実装しており、Barはこのインターフェイスを実装していません。 これをしようとしたときにエラーが表示されません:

Dim fb2 As FooBar = New FooBar(bar) 

完全なコードを:

Module Module1 
    Sub Main() 
     Try 
      Dim foo As Foo = New Foo() 
      Dim bar As Bar = New Bar() 

      Dim fb1 As FooBar = New FooBar(foo) 
      fb1.DoIt() 
      Dim fb2 As FooBar = New FooBar(bar) 
      fb2.DoIt() 
     Catch ex As Exception 
      Console.WriteLine(ex.Message) 
     End Try 
     Console.ReadLine() 
    End Sub 
End Module 

Public Class FooBar 
    Private _f As IFoo 
    Public Sub New(ByVal f As IFoo) 
     _f = f 
    End Sub 

    Public Sub DoIt() 
     _f.DoSomething() 
    End Sub 
End Class 

Public Interface IFoo 
    Sub DoSomething() 
End Interface 

Public Class Foo 
    Implements IFoo 

    Public Sub DoSomething() Implements IFoo.DoSomething 
     Console.WriteLine("DoSomething() called in Foo") 
    End Sub 
End Class 

Public Class Bar 
    Public Sub DoSomething() 
     Console.WriteLine("DoSomething() called in Bar") 
    End Sub 
End Class 

このコードは罰金コンパイルします。 Visual Studioにエラーは表示されません。 しかし、このコードを実行すると、InvalidCastExceptionが返されます。 コンソールの出力:

DoSomething() called in Foo 
Unable to cast object of type 'InterfaceTest.Bar' to type 'InterfaceTest.IFoo'. 

誰でもこの動作を説明できますか?

+0

[Option Strict](http://msdn.microsoft.com/en-us/library/zcd4xwzs%28v=VS.100%29.aspx)を既定でオンにする必要があります。 –

+0

ええと...私は遅くする方法を入力します – Jay

+0

私は今、愚かな感じ、感謝:) – Hemario

答えて

1

プロジェクトのプロパティでOption strictをオンにします。

関連する問題