コンパイラは、オーバーロードされたプロパティまたはプロシージャへの参照を解決しようとしていますが、引数が Object 型であり、参照元オブジェクトにインターフェイスのデータ型があるため、参照は失敗します。
Object引数は、コンパイラに遅延バインディングとして参照を解決するように強制します。
このような状況では、コンパイラは、基になるインターフェイスではなく、実装クラスを介してオーバーロードを解決します。 クラスがオーバーロードされたバージョンの 1 つを名前変更した場合、コンパイラはその名前が異なるため、そのバージョンをオーバーロードと見なしません。 これにより、参照を解決するための正しい選択であった可能性がある場合、コンパイラは名前が変更されたバージョンを無視します。
エラー ID: BC30933
このエラーを解決するには
CTypeを使用して、Objectから呼び出すオーバーロードのシグネチャで指定された型に引数をキャストします。参照オブジェクトを基になるインターフェイスにキャストしても役に立たないことに注意してください。 このエラーを回避するには、引数をキャストする必要があります。
例
次の例は、コンパイル時にこのエラーを引き起こすオーバーロードされた Sub プロシージャの呼び出しを示しています。
Module m1
Interface i1
Sub s1(ByVal p1 As Integer)
Sub s1(ByVal p1 As Double)
End Interface
Class c1
Implements i1
Public Overloads Sub s1(ByVal p1 As Integer) Implements i1.s1
End Sub
Public Overloads Sub s2(ByVal p1 As Double) Implements i1.s1
End Sub
End Class
Sub Main()
Dim refer As i1 = New c1
Dim o1 As Object = 3.1415
' The following reference is INVALID and causes a compiler error.
refer.s1(o1)
End Sub
End Module
前の例では、コンパイラが記述されたs1の呼び出しを許可した場合、解決はインターフェイス c1の代わりにクラス i1を介して行われます。 これは、s2で定義されている正しい選択であっても、c1で名前が異なるため、コンパイラはi1を考慮しないことを意味します。
次のいずれかのコード行に呼び出しを変更することで、エラーを修正できます。
refer.s1(CType(o1, Integer))
refer.s1(CType(o1, Double))
上記の各コード行は、 Object 変数 o1 を、オーバーロードに対して定義されているパラメーター型のいずれかに明示的にキャストします。
こちらも参照ください
.NET