考虑以下代码(控制台应用程序,简化测试用例):
Option Strict On
Module Module1
Enum Enum1
vDefaultEnum1
End Enum
Enum Enum2
vDefaultEnum2
End Enum
Delegate Sub FunctionX(eValue As [Enum])
Sub Function1(eValue As Enum1)
End Sub
Sub Function2(eValue As Enum2)
End Sub
Sub Main()
Dim version As String = "1"
Dim d As FunctionX
Select Case version
Case "1" : d = AddressOf Function1
Case "2" : d = AddressOf Function2
Case Else : Throw New NotImplementedException
End Select
d.Invoke(Enum1.vDefaultEnum1)
End Sub
End Module
我收到此错误:
Option Strict On不允许缩小方法' Public Sub Function1(eValue As Enum1)'之间的隐式类型转换。并委托'委托子功能X(eValue As System.Enum)'。
我理解这是因为Enum
is a supertype用于Enum1
和Enum2
,转换可以正常工作。我试图避免为每个Enum
类型创建一个新的委托(每个项目将有约50个)。
在上面的例子中有没有办法实现这个想法?
对于此示例,请假设Function1
和Function2
是另一个我无法访问的程序集的一部分。它们仅因枚举类型参数而不同(使用不同的枚举)。
注意:以上是简化测试用例。在现实生活场景中,函数签名要大得多,对象深埋在10级命名空间内,所以在每个项目中声明大约50个代表看起来很难看。
答案 0 :(得分:4)
也许通用代表为您提供了更明智的选择:
Delegate Sub FunctionX(Of T)(eValue As T)