Проверка типа .NET на интерфейсе - PullRequest
1 голос
/ 06 января 2012

Я пытаюсь реализовать шаблон проектирования Стратегии с использованием интерфейсов. Однако при разработке кода я наткнулся на что-то странное. Тип объекта не проверяется во время разработки.

Соблюдайте следующий код. Обратите внимание, что 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. Выход консоли:

* * 1010

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

1 Ответ

1 голос
/ 06 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...