1

パラメータの1つがインターフェイスである場合、Visual Studioは型チェック関数のパラメータを停止しているようです。VB.Netの関数インターフェイスパラメータを使った型チェックfun

は、次のことを考えてみましょう:

' 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

Option Strictがオフになっていると思います。 Option Strictをonにすると、あなたのコードは期待どおりにコンパイルされません。

SomeFunc(list, a) 

は、このようにされていません:これはという

注最初のケースで

SomeFunc(list, list) 

、strictオプションがオフの場合、コンパイラは効果的にあなたのためにキャストを挿入しています。結局、タイプIAの値はであり、MyReferenceTypeとなります。第2のケースで

List(Of String)の値はこれまでは(... Nothingの値の議論の余地の例外を除いて)MyReferenceTypeと互換性がないができ、そうでもオプション厳格オフにし、コンパイルが失敗します。コンパイラはこれまでどおりに動作しないものを試すことはできません。

ストーリーのモラル:より良いタイプチェックのために、Option Strictをオンにします。

+0

あなたは正しいです!私は何とかOption Strictをオフにしたに違いありません。MSDNはデフォルト状態がオンであると言います。 – AuGambit

関連する問題