关于.net:有没有办法在VB.NET中定义隐式转换运算符?

Is there a way to define an implicit conversion operator in VB.NET?

在C中,可以使用隐式关键字定义隐式用户定义的类型转换运算符。

在vb.net中,可以定义一个ctype转换运算符,该运算符将用户定义的类型显式转换为另一个类型。

有没有方法在vb.net中声明隐式转换运算符?

我似乎找不到任何关于这个的信息……

回答

我在Widening操作员的msdn文档中找到了答案。显然,对于隐式转换,CTYPE Widening运算符被"调用",而CTYPE Narrowing运算符被调用,用于显式转换。

起初,我认为这个文档是不正确的,因为我在测试期间遇到了一个异常。我重新测试发现了一些非常奇怪的东西。当使用"="运算符完成隐式强制转换时,作为加宽转换运算符实现的函数可以正常工作。

例如,下面将隐式地将Something类型转换为MyClass类型。它正确调用了我的Widening转换实现,一切正常工作:

1
2
Dim y As Something
Dim x As MyClass = y

但是,如果隐式强制转换是在foreach循环中完成的,则它不起作用。

例如,当Something类型在For Each循环中隐式强制转换为MyClass类型时,以下代码将引发异常("无法将‘something’类型的对象强制转换为‘myclass’类型):

1
2
3
4
 Dim anArrayOfSomethingTypes() As Something  = getArrayOfSomethings()
 For Each x As MyType In anArrayOfSomethingTypes
  ....
 Next

对此,我们深表感谢。


在VB.NET中使用"create widening CType放映两个隐式转换。

1
2
3
4
5
Class C1
    Public Shared Widening Operator CType(ByVal p1 As C1) As C2

    End Operator
End Class

在对面,一个显式转换,可以做为城市Narrowing插拔Widening以上的定义。