InvalidCastException во время выполнения с неявным оператором приведения - PullRequest
2 голосов
/ 13 октября 2009

У меня есть библиотека 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-взаимодействия.

Есть идеи?

1 Ответ

1 голос
/ 13 октября 2009

Во-первых, я бы попытался пометить сборку C # как CLSCompliant(true), чтобы посмотреть, генерирует ли это какие-либо предупреждения для implicit operator Foo.

Ага, здесь это:

Проблема в том, что VB.NET просто не вызывает op_Implicit / op_Explicit функций, предоставляемых кодом C #. Углубившись в движок Visual Basic, вы можете увидеть, что под крышками он использует ICovertible для выполнения всех своих преобразований.

...