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_Explicit深入研究 Visual Basic 引擎,您可以看到它用于ICovertible完成所有转换。

于 2009-10-13T15:29:25.147 回答