在运行时在不相关的类之间隐式转换对象类型

时间:2013-04-28 01:00:15

标签: vb.net vb6-migration

以下VB.Net代码在运行时失败并出现InvalidCastException错误。如果我将变量a1的类型从Object更改为class A,则程序执行OK。

我想在不更改下面示例代码中的Test()函数的情况下解决此问题。如果需要,我可以轻松更改Class AClass B的定义。

Public Class A
    Public Shared Widening Operator CType(ByVal d As A) As B
        Return New B
    End Operator
End Class

Public Class B

End Class

Module X
    Public Sub Test()
        Dim a1 As Object = New A

        Dim b1 As B
        b1 = a1                         ' Fails with System.InvalidCastException

    End Sub
End Module

1 个答案:

答案 0 :(得分:1)

    Dim a1 As Object = New A

将a1声明为对象似乎是编译器抱怨代码的一种解决方法。但它没有用,也没有用,因为CLR不会在运行时寻找转换运算符。 VB.NET语言规范阐述了第9.8.3章中的规则:

  

类型无法声明转换位置:

     
      
  • 源类型和目标类型相同。
  •   
  • 源类型和目标类型都不是定义转换运算符的类型。
  •   
  • 源类型或目标类型是接口类型。
  •   
  • 源类型和目标类型通过继承(包括Object)相关联。
  •   

最后一颗子弹是你的克星。只需使用一个函数。