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

Fri*_*ale 26 .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
Run Code Online (Sandbox Code Playgroud)

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

例如,当在循环中隐式转换类型时,以下代码将抛出异常(" 无法将'Something'类型的对象强制转换为'MyClass' "):SomethingMyClassFor Each

 Dim anArrayOfSomethingTypes() As Something  = getArrayOfSomethings()
 For Each x As MyType In anArrayOfSomethingTypes 
  ....
 Next
Run Code Online (Sandbox Code Playgroud)

我们非常感谢您对此的任何见解.

Jar*_*Par 34

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

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

    End Operator
End Class
Run Code Online (Sandbox Code Playgroud)

相反,显式转换,可以通过交换来完成Narrowing对于Widening在上面的定义.