通用和双重操作

时间:2010-02-21 11:21:20

标签: c# generics

我需要在泛型类中进行计算。我已经找到了像这里的一些解决方案:Solution for overloaded operator constraint in .NET generics,但我需要用双重计算T。是否有可能将T加倍? 所以我可以写这样的代码:

class Myclass<T>{
  T value;
  public double Half() {
    return  i.value  / 2;
  }
}

Myclass<int> i = new Myclass<int>();
double x = i.Half();

谢谢!

3 个答案:

答案 0 :(得分:2)

Geenrics和运营商不混合。在4.0中,您可以使用dynamic;在那之前,MiscUtilDivideInt32,它应该适用于以下情况:

T half = Operator.DivideInt32(value, 2);

但是,double中的具体化并不会真正奏效。在这种情况下,您可以使用double(而不是T开始。您可以使用ToStringParse,但这既不强大也不高效。

编辑 - 还有Convert,因此您可以尝试

return Operator.Convert<T,double>(value) / 2;

答案 1 :(得分:1)

您链接的问题中的答案是正确的:您无法在C#中真正做到这一点。

您可以做的最好的事情是为每种可能的类型重新实施一次Half方法:

public double Half() {
    if (typeof(T) == typeof(double))
        return HalfDouble();
    else if (typeof(T) == typeof(int))
        return HalfInt();
    else if (typeof(T) == typeof(decimal))
        return HalfDecimal();
    // etc.
}

答案 2 :(得分:0)

你可以做的是让类构造函数接受一个Func<T,double>类型的参数,将T转换为double。在double Half()函数中,您调用此仿函数并将结果除以2.

有关此技术的更多信息,请阅读Bill Wagner的'Effective C#'。