使用泛型和双精度进行操作

3

我需要在一个通用类中进行计算。我已经找到了一些解决方案,比如这里:.NET泛型中重载运算符约束的解决方案,但是我需要使用double来计算T。是否可以将T强制转换为double?

这样我就可以编写以下代码:

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

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

谢谢!


你的示例代码中应该是 return this.value / 2;,对吗? - M4N
3个回答

2
泛型和运算符不兼容。在4.0版本中,您可以使用dynamic来解决此问题;在此之前,MiscUtil提供了DivideInt32,适用于以下情况:
T half = Operator.DivideInt32(value, 2);

然而,专注于double并不会很好地发挥作用。在这种情况下,您可以一开始就使用double(而不是T)。您可以使用ToStringParse,但这既不健壮也不高效。
编辑 - 还有Convert,所以您可以尝试:
return Operator.Convert<T,double>(value) / 2;

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.
}

0
你可以让类构造函数接受一个类型为 Func<T,double> 的参数,将你的 T 转换为 double。在 double Half() 函数中,调用这个函数并将结果除以 2。
要了解更多关于这种技术的信息,请阅读 Bill Wagner 的《Effective C#》。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接