【发布时间】:2018-07-29 04:36:34
【问题描述】:
假设我有以下功能:
public int Compute(int a, int b, int c)
{
return (a + b +c)/3;
}
public double Compute(double a, double b, double c)
{
return ((a + b + c) / 3.0) / 209;
}
我希望区别很明显。双精度值需要除以 209(一个常数值),而整数则不需要。
使用泛型将这两个函数组合成一个函数的最佳方法是什么?
【问题讨论】:
-
泛型用于进行操作……嗯……泛型。 IOW,它们用于使操作不关心它们正在操作的类型。您的操作显然确实关心,因为它的行为不同。
-
我认为最好的方法是完全不这样做并保持原样,是否有理由需要通用版本?
-
这样写代码会更干净...
-
签名可以是通用的:public T Compute
(T a, T b, T c)。但是由于你用双精度数和整数做不同的操作,你必须检查泛型方法中的类型,这意味着它首先不应该是泛型的。此外,并非所有类型都支持数学运算,因此在大多数非数字类型上都会失败。 -
即使将带有
(a+b+c)/3的部分提取到共享泛型方法中也不可行,因为C# 无法将泛型类型参数限制为允许+之类的“算术”参数和/。如果这是你真的想问的,那是不可能的。