У меня есть библиотека C #, которую внутренние клиенты настраивают с помощью VB.Net
Их сценарии выдают 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 динамически компилируется - компиляция происходит при первом входе пользователя в приложение. он компилируется как VB.Net против .Net 3.5, и я не использую COM-взаимодействия.
Есть идеи?