关于不同 return 类型的函数重载的问题
Issue about function overloads with different return type
我有一个功能是这样的:
Public Shared Iterator Function MyFunction(ByVal param1 As String) _
As IEnumerable(Of FileInfo)
...
End Function
我想添加一个重载,它采用相同的参数 Type 但更改 return Type 如下:
Public Shared Iterator Function MyFunction(ByVal param1 As String) _
As IEnumerable(Of String)
...
End Function
可以在不更改 param1
类型的情况下完成吗?我考虑过在 Function MyFunction(Of T)(ByVal param1 As String) As Ienumerable(Of T)
等两个函数上添加 Type 参数以期待用法如下:
Dim collection As IEnumerable(Of String) = MyFunction(Of String)("")
Dim collection As IEnumerable(Of FileInfo) = MyFunction(Of FileInfo)("")
但要做到这一点,我还需要更改 param1
值的 Type 并且我还看到了人为错误传递不同类型参数的缺点,例如调用例如作为 Return MyFunction(Of Integer)("")
的函数,然后在函数内添加对意外类型参数的错误处理......似乎不是 clean/safe 的方法。
所以我明确地想将 param1
用作 String,相同的函数名称,并且 return 每个函数的不同枚举,我是完全意识到 return 是一个 Object 的函数或以这种方式与类型参数混淆,我认为这不是一个干净的解决方案:
Public Shared Iterator Function MyFunction(Of T)(ByVal param1 As String) _
As IEnumerable(Of T)
Select Case GetType(T)
Case GetType(String)
Yield CTypeDynamic(Of T)(param1)
Case GetType(FileInfo)
Yield CTypeDynamic(Of T)(New FileInfo(param1))
Case Else
Throw New ArgumentException("Unexpected Type parameter", "T")
End Case
End Function
哪个是解决此问题的干净方法? ...这真的符合我公开的要求吗?
在这种情况下,de jure/facto 只是简单地重命名每个函数以反映 return 类型。事实上,这是我推荐的唯一方法。
Public Shared Iterator Function GetStrings(ByVal param1 As String) As IEnumerable(Of String)
End Function
Public Shared Iterator Function GetFiles(ByVal param1 As String) As IEnumerable(Of FileInfo)
End Function
选项 1
但是如果您可以忍受一些模棱两可的警告,那么一个选择是创建一个自定义的 return 类型来实现 IEnumerable(T).
Public Class MyFunctionIterator
Implements IEnumerable, IEnumerable(Of String), IEnumerable(Of FileInfo)
Friend Sub New(param1 As String)
Me.param1 = param1
End Sub
Private param1 As String
Public Iterator Function GetStrings() As IEnumerator(Of String) Implements IEnumerable(Of String).GetEnumerator
For Each item As String In {"a", "b", "c", "d"}
Yield item
Next
End Function
Public Iterator Function GetFiles() As IEnumerator(Of FileInfo) Implements IEnumerable(Of FileInfo).GetEnumerator
For Each name As String In Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments))
Yield New FileInfo(name)
Next
End Function
Private Iterator Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
Throw New NotSupportedException()
End Function
End Class
Public Shared Function MyFunction(ByVal param1 As String) As MyFunctionIterator
Return New MyFunctionIterator(param1)
End Function
用法
Dim collection1 As IEnumerable(Of String) = MyFunction("...")
Dim collection2 As IEnumerable(Of FileInfo) = MyFunction("...")
For Each s In collection1
Debug.Write(s & ", ")
Next
Debug.WriteLine("")
For Each fi In collection2
Debug.Write(fi.Name & ", ")
Next
a, b, c, d,
desktop.ini, file1.txt, file2.txt, file3.txt,
选项 2
如果您不使用接口,另一种选择是创建自定义return类型并定义conversion operators.
Public Class MyFunctionResult
Friend Sub New(param1 As String)
Me.param1 = param1
End Sub
Private param1 As String
Public Function GetString() As String
Return ("Hello " & Me.param1 & "!")
End Function
Public Shared Widening Operator CType(value As MyFunctionResult) As String
Return value.GetString()
End Operator
Public Function GetFile() As FileInfo
Return New FileInfo(Me.param1)
End Function
Public Shared Widening Operator CType(value As MyFunctionResult) As FileInfo
Return value.GetFile()
End Operator
End Class
Public Shared Function MyFunction(ByVal param1 As String) As MyFunctionResult
Return New MyFunctionResult(param1)
End Function
用法
Dim s As String = MyFunction("Bjørn")
Dim fi As FileInfo = MyFunction("C:\Users\bjorn\Documents\file1.txt")
Debug.WriteLine(s)
Debug.WriteLine(fi.Name)
Hello Bjørn!
file1.txt
我有一个功能是这样的:
Public Shared Iterator Function MyFunction(ByVal param1 As String) _
As IEnumerable(Of FileInfo)
...
End Function
我想添加一个重载,它采用相同的参数 Type 但更改 return Type 如下:
Public Shared Iterator Function MyFunction(ByVal param1 As String) _
As IEnumerable(Of String)
...
End Function
可以在不更改 param1
类型的情况下完成吗?我考虑过在 Function MyFunction(Of T)(ByVal param1 As String) As Ienumerable(Of T)
等两个函数上添加 Type 参数以期待用法如下:
Dim collection As IEnumerable(Of String) = MyFunction(Of String)("")
Dim collection As IEnumerable(Of FileInfo) = MyFunction(Of FileInfo)("")
但要做到这一点,我还需要更改 param1
值的 Type 并且我还看到了人为错误传递不同类型参数的缺点,例如调用例如作为 Return MyFunction(Of Integer)("")
的函数,然后在函数内添加对意外类型参数的错误处理......似乎不是 clean/safe 的方法。
所以我明确地想将 param1
用作 String,相同的函数名称,并且 return 每个函数的不同枚举,我是完全意识到 return 是一个 Object 的函数或以这种方式与类型参数混淆,我认为这不是一个干净的解决方案:
Public Shared Iterator Function MyFunction(Of T)(ByVal param1 As String) _
As IEnumerable(Of T)
Select Case GetType(T)
Case GetType(String)
Yield CTypeDynamic(Of T)(param1)
Case GetType(FileInfo)
Yield CTypeDynamic(Of T)(New FileInfo(param1))
Case Else
Throw New ArgumentException("Unexpected Type parameter", "T")
End Case
End Function
哪个是解决此问题的干净方法? ...这真的符合我公开的要求吗?
在这种情况下,de jure/facto 只是简单地重命名每个函数以反映 return 类型。事实上,这是我推荐的唯一方法。
Public Shared Iterator Function GetStrings(ByVal param1 As String) As IEnumerable(Of String)
End Function
Public Shared Iterator Function GetFiles(ByVal param1 As String) As IEnumerable(Of FileInfo)
End Function
选项 1
但是如果您可以忍受一些模棱两可的警告,那么一个选择是创建一个自定义的 return 类型来实现 IEnumerable(T).
Public Class MyFunctionIterator
Implements IEnumerable, IEnumerable(Of String), IEnumerable(Of FileInfo)
Friend Sub New(param1 As String)
Me.param1 = param1
End Sub
Private param1 As String
Public Iterator Function GetStrings() As IEnumerator(Of String) Implements IEnumerable(Of String).GetEnumerator
For Each item As String In {"a", "b", "c", "d"}
Yield item
Next
End Function
Public Iterator Function GetFiles() As IEnumerator(Of FileInfo) Implements IEnumerable(Of FileInfo).GetEnumerator
For Each name As String In Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments))
Yield New FileInfo(name)
Next
End Function
Private Iterator Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
Throw New NotSupportedException()
End Function
End Class
Public Shared Function MyFunction(ByVal param1 As String) As MyFunctionIterator
Return New MyFunctionIterator(param1)
End Function
用法
Dim collection1 As IEnumerable(Of String) = MyFunction("...")
Dim collection2 As IEnumerable(Of FileInfo) = MyFunction("...")
For Each s In collection1
Debug.Write(s & ", ")
Next
Debug.WriteLine("")
For Each fi In collection2
Debug.Write(fi.Name & ", ")
Next
a, b, c, d,
desktop.ini, file1.txt, file2.txt, file3.txt,
选项 2
如果您不使用接口,另一种选择是创建自定义return类型并定义conversion operators.
Public Class MyFunctionResult
Friend Sub New(param1 As String)
Me.param1 = param1
End Sub
Private param1 As String
Public Function GetString() As String
Return ("Hello " & Me.param1 & "!")
End Function
Public Shared Widening Operator CType(value As MyFunctionResult) As String
Return value.GetString()
End Operator
Public Function GetFile() As FileInfo
Return New FileInfo(Me.param1)
End Function
Public Shared Widening Operator CType(value As MyFunctionResult) As FileInfo
Return value.GetFile()
End Operator
End Class
Public Shared Function MyFunction(ByVal param1 As String) As MyFunctionResult
Return New MyFunctionResult(param1)
End Function
用法
Dim s As String = MyFunction("Bjørn")
Dim fi As FileInfo = MyFunction("C:\Users\bjorn\Documents\file1.txt")
Debug.WriteLine(s)
Debug.WriteLine(fi.Name)
Hello Bjørn!
file1.txt