Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 泛型的有效重载_.net_Generics_Overloading - Fatal编程技术网

.net 泛型的有效重载

.net 泛型的有效重载,.net,generics,overloading,.net,Generics,Overloading,我的问题一半是风格,一半是功能。我正在重写一个库并尽可能地压缩它。(它采用一个路径并将值读入ByRef变量中。)以前它是这样的: 公共子读取(ByVal名称作为字符串,ByRef值(,)作为整数) 公共子读取(ByVal名称为字符串,ByRef值(,)为长) 等等等等。。。其中大约有30个,包括标量版本。需要更新 每个方法都按类型和等级重载。我正在用泛型重做这个系统,但我遇到了一个问题。以下方法将不会编译: Public Sub-Read(Of T)(ByVal名称作为字符串,ByRef值作为T

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

公共子读取(ByVal名称作为字符串,ByRef值(,)作为整数)

公共子读取(ByVal名称为字符串,ByRef值(,)为长)

等等等等。。。其中大约有30个,包括标量版本。需要更新

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

Public Sub-Read(Of T)(ByVal名称作为字符串,ByRef值作为T)

Public Sub-Read(Of T)(ByVal名称作为字符串,ByRef值作为T())

Public Sub-Read(Of T)(ByVal名称作为字符串,ByRef值作为T(,))

Public Sub-Read(Of T)(ByVal名称为字符串,ByRef值为T(,))

很明显为什么它不会编译;类型“T”很容易被视为数组,编译器不知道是选择第一个重载还是第二个重载。(注意:如果没有重载读取方法的标量版本,则此系统的工作方式与您预期的一样。)

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

基本上,有没有一种方法可以像我所展示的那样设计我的重载?我可以明确地告诉编译器我希望top重载只用于标量输入吗?如果不是,最好的设计是什么?我愿意接受任何有创意的想法


谢谢

您可以尝试的一件事是使您的第一个重载只接受结构(如果您在本例中只使用数值)

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

要做的另一件事,有点难看,就是让所有数组重载使用不同的名称,标量使用自己的名称。 在scalar版本中,您可以检查
T是否为数组,计算它的维数并调用propper数组重载。

这很奇怪,在
C#
中,使用
.NET 3.5
这不是问题,编译和运行都没有问题。无论如何,试着按照下面的答案做。
Public Sub Read(Of T As Structure)(ByVal name as String, ByRef values As T)