【发布时间】:2013-07-03 18:29:56
【问题描述】:
我的问题一半是风格,一半是功能。我正在重写一个库并试图尽可能地压缩它。 (它采用路径并将值读取到 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(,,))
它不能编译的原因很明显; type 'T' 很容易被认为是一个数组,编译器不知道是选择第一个重载还是第二个重载。 (注意:如果没有重载的 Read 方法的标量版本,此系统将按预期工作。)
所以,我有一个难题。我不知道设计这些重载的最佳方法,所以我使用最少的代码,同时保持与使用这个库的现有代码尽可能多的向后兼容性。 (我们严格在内部使用它,所以我可以使用我的库更改任何代码,但我宁愿尽可能保持签名相同。)
基本上,有没有办法像我展示的那样设计我的重载?我可以明确告诉编译器我希望顶部重载仅用于标量输入吗?如果没有,最好的设计是什么?我愿意接受任何创意。
谢谢
【问题讨论】:
-
这很奇怪,在
C#和.NET 3.5中这不是问题,编译和运行都没有问题。无论如何,请尝试按照下面的答案进行操作。
标签: .net generics overloading