2

内部クライアントがVB.Netで構成するC#ライブラリがあります

InvalidCastException彼らのスクリプトは、彼らが本当にすべきではない場所を投げています。

したがって、コードは次のようになります(大幅に簡略化されています)。

//C#3
public class Foo {

    public static implicit operator Foo ( Bar input )
    { 
        return new Foo( input.Property1, input.Property2 ); 
    }
}

次に、VB.Netで(これも大幅に簡略化されています):

Dim fc = New FooCollection()
Dim b as Bar = GetBar()

fc(fooIndex) = b 'throws InvalidCastException at runtime!

暗黙的/拡大演算子内にブレークポイントを追加すると、到達しません。

暗黙の演算子を削除すると、コンパイルされません。

C#で同等のステートメントを実行すると:

var fc = new FooCollection();
Bar b = GetBar();

fc[fooIndex] = b //it works!

奇妙な-VB.netコンパイラはキャスト演算子を見つけることができるように見えますが、実行時に失われます。確かに、VBとC#ILはここでかなり似ていますか?

VB.netコードは動的にコンパイルされます。コンパイルは、ユーザーがアプリに初めてログインしたときに行われます。.Net 3.5に対してVB.Netとしてコンパイルされており、COM相互運用機能を使用していません。

何か案は?

4

1 に答える 1

1

まず、C#アセンブリにマークを付けて、にCLSCompliant(true)警告が生成されるかどうかを確認しますimplicit operator Foo

ああ、ここにあります:

問題は、VB.NETがC#コードによって公開されたop_Implicit/関数を単純に呼び出さないことです。op_ExplicitVisual Basicエンジンを詳しく調べると、ICovertibleすべての変換を実行するために使用されていることがわかります。

于 2009-10-13T15:29:25.147 に答える