0

我的问题是一半风格,一半功能。我正在重写一个库并试图尽可能地压缩它。(它采用路径并将值读取到 ByRef 变量中。)以前它看起来像这样:

Public Sub Read(ByVal name As String, ByRef values(,) As Integer)

Public Sub Read(ByVal name As String, ByRef values(,,) As Long)

等等等等......其中大约有30个,包括标量版本。噩梦更新。

每个方法都按类型和等级重载。我正在用泛型重做这个系统,但我遇到了一个问题。以下方法不会编译:

Public Sub Read(Of T)(ByVal name as String, ByRef values As T)

Public Sub Read(Of T)(ByVal name as String, ByRef values As T())

Public Sub Read(Of T)(ByVal name as String, ByRef values As T(,))

Public Sub Read(Of T)(ByVal name as String, ByRef values As T(,,))

很明显为什么它不能编译;'T' 类型很容易被认为是一个数组,编译器不知道是选择第一个重载还是第二个重载。(注意:如果没有重载 Read 方法的标量版本,此系统将按您预期的方式工作。)

所以,我有一个难题。我不知道设计这些重载的最佳方法,所以我使用最少的代码,同时保持与使用这个库的现有代码的尽可能多的向后兼容性。(我们严格在内部使用它,所以我可以使用我的库更改任何代码,但我宁愿尽可能保持签名相同。)

基本上,有没有办法像我展示的那样设计我的重载?我可以明确告诉编译器我希望顶部重载仅用于标量输入吗?如果没有,最好的设计是什么?我对任何创意都持开放态度。

谢谢

4

1 回答 1

0

您可以尝试的一件事是让您的第一个重载仅采用结构(如果您在您的情况下仅使用数值)。

Public Sub Read(Of T As Structure)(ByVal name as String, ByRef values As T)

也许这可以进行重载选择,因为数组不是结构。

要做的另一件事,有点丑陋,是使所有数组重载具有不同的名称,并使用自己的名称进行标量。在标量版本中,您检查 if T is Array,计算它的维度并调用 propper 数组重载。

于 2013-07-10T11:54:14.300 回答