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

时间:2009-08-21 15:10:38

标签: .net vb.net

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

在VB.NET中,您可以定义一个CType转换运算符,它将用户定义的类型显式转换为另一种类型。

有没有办法在VB.NET中声明隐式转换运算符?

我似乎无法找到关于此的任何信息......


答案

我在Widening运算符的MSDN文档中找到了答案。显然,CType Widening运算符被“调用”用于隐式转换,而CType Narrowing运算符被调用用于显式转换。

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

例如,以下内容将隐式地将Something类型转换为MyClass。它会正确调用我的Widening转换实现,所有内容都可以正常运行:

Dim y As Something
Dim x As MyClass = y

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

例如,当Something类型被隐式转换为以下代码时,以下代码将引发异常(“无法将类型为'Something'的对象转换为'MyClass'”) MyClass循环中的For Each

 Dim anArrayOfSomethingTypes() As Something  = getArrayOfSomethings()
 For Each x As MyType In anArrayOfSomethingTypes 
  ....
 Next

非常感谢对此的任何见解。

1 个答案:

答案 0 :(得分:31)

在VB.NET中,使用Widening CType运算符创建隐式转换:

Class C1
    Public Shared Widening Operator CType(ByVal p1 As C1) As C2

    End Operator
End Class

相反,显式转换可以通过在上述定义中交换Narrowing Widening来完成。