如何使用泛型将两个函数合并为一个函数?

时间:2018-07-27 15:35:20

标签: c# generics

说我具有以下功能:

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(一个常数),而一个整数则不需要。

使用泛型将这两个功能组合在一个功能中的最佳方法是什么?

4 个答案:

答案 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 operationrestrict T to be numeric

此外,即使有可能,在这种特定情况下您也不会获得太大收益,因为在我的假设解决方案中,用法看起来很笨拙。

答案 2 :(得分:0)

您不应该使用泛型,但是可以测试abc是否为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)

我有个主意。我可以创建一个通用方法,为每种情况usingDelegate接收一个int。这个版本的提琴作品https://dotnetfiddle.net/Q15bYK

double

但这似乎使我的答案变得复杂,我也同意其他答案,泛型用于为不同的对象类型编写类似的代码,而不是为每个参数编写不同的代码。