我需要在泛型类中进行计算。我已经找到了像这里的一些解决方案: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();
谢谢!
答案 0 :(得分:2)
Geenrics和运营商不混合。在4.0中,您可以使用dynamic
;在那之前,MiscUtil有DivideInt32
,它应该适用于以下情况:
T half = Operator.DivideInt32(value, 2);
但是,double
中的具体化并不会真正奏效。在这种情况下,您可以使用double
(而不是T
)开始。您可以使用ToString
和Parse
,但这既不强大也不高效。
编辑 - 还有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#'。