Веселье проверки типов с параметрами интерфейсов функций в VB.Net - PullRequest
1 голос
/ 04 марта 2012

Кажется, Visual Studio перестает проверять параметры функции, когда один из параметров является интерфейсом.

Рассмотрим следующее:

' An interface and the class that implements it:
Public Interface IA

End Interface

Public Class A
    Implements IA
End Class


' Another reference type for the demonstration:
Public Class MyReferenceType

End Class


' A function that uses IA as the type of one of its parameters:
Private Function SomeFunc(ByVal a As IA, ByVal r As MyReferenceType)
    Return Nothing
End Sub

А вот пример проблем проверки типов:

Private Sub Example()
    Dim a As IA = New A
    Dim r As New MyReferenceType

    ' Some other random reference type, choose any 
    ' other reference type you like
    Dim list As New List(Of String)

    ' Each of these calls to SomeFunc compile without errors.
    SomeFunc(r, r)
    SomeFunc(r, a)
    SomeFunc(list, r)
    SomeFunc(list, a)

    ' Does not compile due to type mismatch
    'SomeFunc(list, list)
End Sub

Как показывают мои комментарии, этот код компилируется нормально, сошибок в редакторе тоже нет.Если я выполню программу, то получу System.InvalidCastException, что совсем не удивительно.Я предполагаю, что это ошибка проверки типов в компиляторе?Я использую Visual Studio 2005, поэтому это исправлено в более поздней версии VS?

1 Ответ

1 голос
/ 04 марта 2012

Я полагаю, это потому, что у вас есть Option Strict off. Если вы включите Option Strict для начала, ваш код не скомпилируется, как мы и ожидали.

Обратите внимание, что это:

SomeFunc(list, a)

не так:

SomeFunc(list, list)

В первом случае, когда Option Strict выключен, компилятор эффективно вставляет приведение для вас. В конце концов, значение типа IA может быть MyReferenceType.

Во втором случае значения List(Of String) не могу никогда совместим с MyReferenceType (с спорным исключением стоимости Nothing ...), да еще и с Option Strict выкл, компиляция не удалась Компилятор не позволит вам попробовать что-то, что никогда не будет работать.

Мораль истории: для лучшей проверки типов включите Option Strict.

...