Проверка типа.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'.

Кто-нибудь может объяснить это поведение?

1 ответ

Решение

Включите опцию строго в свойствах проекта.

Другие вопросы по тегам