说我具有以下功能:
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(一个常数),而一个整数则不需要。
使用泛型将这两个功能组合在一个功能中的最佳方法是什么?
答案 0 :(得分:2)
我不确定这里是否有意义。 泛型是避免为不同的对象类型编写类似代码的方法。
但是在您的情况下,我看不到任何可以推广的类似代码,因此保持不同的功能可以更好地解决任务。
答案 1 :(得分:1)
简短回答
您不能将其变成一种功能。
长期回答
您唯一的常见代码是这样:
return (a + b +c)/
您可以使用泛型,并且最好做到这一点(C#无法做到):
public static T Compute<T>(T a, T b, T c, T divisorSmall, int divisor)
{
return ((a + b + c) / divisorSmall) / divisor;
// Results in compiler error: Error CS0019 Operator '+' cannot be
// applied to operands of type 'T' and 'T'
}
并像这样使用它:
Compute(1, 2, 3, 3, 1); // For integers
Compute(1.0, 2.0, 6.0, 3.0, 209); // For doubles
但是您不能这样做,因为you cannot restrict the type T to support arithmetic operation或restrict T to be numeric。
此外,即使有可能,在这种特定情况下您也不会获得太大收益,因为在我的假设解决方案中,用法看起来很笨拙。
答案 2 :(得分:0)
您不应该使用泛型,但是可以测试a
,b
和c
是否为int
,然后选择您的操作:
private double Compute(double a, double b, double c)
{
/* check if a, b and c are integers int if true double if false */
return (a % 1 == 0 && b % 1 == 0 && c % 1 == 0) ? (a + b + c) / 3 : ((a + b + c) / 3.0) / 209;
}
[TestMethod()]
public void Int()
{
int a = 1;
int b = 2;
int c = 3;
int result = (int)Compute(a, b, c);
int expected = (1 + 2 + 3) / 3;
Assert.AreEqual(expected, result);
}
[TestMethod()]
public void Double()
{
double a = 1.1;
double b = 2.2;
double c = 3.3;
double result = Compute(a, b, c);
double expected = ((1.1 + 2.2 + 3.3) / 3.0) / 209;
Assert.AreEqual(expected, result);
}
两个测试都通过了
答案 3 :(得分:0)
我有个主意。我可以创建一个通用方法,为每种情况using
和Delegate
接收一个int
。这个版本的提琴作品https://dotnetfiddle.net/Q15bYK
double
但这似乎使我的答案变得复杂,我也同意其他答案,泛型用于为不同的对象类型编写类似的代码,而不是为每个参数编写不同的代码。