以下VB.Net代码在运行时失败并出现InvalidCastException
错误。如果我将变量a1
的类型从Object
更改为class A
,则程序执行OK。
我想在不更改下面示例代码中的Test()
函数的情况下解决此问题。如果需要,我可以轻松更改Class A
或Class 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
答案 0 :(得分:1)
Dim a1 As Object = New A
将a1声明为对象似乎是编译器抱怨代码的一种解决方法。但它没有用,也没有用,因为CLR不会在运行时寻找转换运算符。 VB.NET语言规范阐述了第9.8.3章中的规则:
类型无法声明转换位置:
- 源类型和目标类型相同。
- 源类型和目标类型都不是定义转换运算符的类型。
- 源类型或目标类型是接口类型。
- 源类型和目标类型通过继承(包括Object)相关联。
最后一颗子弹是你的克星。只需使用一个函数。