可能重复: 定义实现+运算符的泛型
最近,我正在开发一个实现算法的C#类库。关键是,我希望库的用户能够选择算法应该使用的机器精度(单精度或双精度),我正在尝试使用泛型。因此,例如:
Algorithm<double> a = new Algorithm<double>();
/** Some initializations here */
double result = a.Solve();或
Algorithm<float> a = new Algorithm<float>();
/** Some initializations here */
float result = a.Solve();因此,泛型类的类型参数意味着是一个十进制数(因为在算法代码中,我需要使用+、*、/、-),但是我不知道对它施加哪种类型约束。我考虑过与所有操作符建立一个接口,但不幸的是,这是不允许的。有什么想法吗?
否则,是否有可能在C#中获得类似于C++中的模板专业化的东西?
谢谢
托马索
发布于 2010-09-06 14:02:42
基本上你不能。CLR类型系统不支持这种约束。
我以前曾在博客中提到过如何使用“静态接口”来描述这些约束,但我不知道有任何类似的计划。
您可能想看看MiscUtil泛型运算符支持,它允许您使用操作符--但是您必须使用struct之类的约束,这当然允许您不想要的Guid之类的东西。
发布于 2010-09-06 14:42:13
最接近的匹配是值类型约束。
C#只允许三种类型的约束
有关完整的文档,请参阅MSDN:
topic4
发布于 2010-09-06 16:19:00
您可以使用一个解决方案:为您想要支持的每个类型定义一个方法。
private static Add(float a, float b)
{return a+b;}
private static Add(double a, double b)
{return a+b;}
...并在运行时为正确的委托创建一个委托:
MethodInfo addMethod=this.GetType().GetMethod("Add",BindingFlags.NotPublic|Static,null,new Type[2]{typeof(T),typeof(T)},null);
Func<T,T,T> addFunction=(Func<T,T,T>)Delegate.CreateDelegate(typeof(Func<T,T,T>),addMethod);https://stackoverflow.com/questions/3652053
复制相似问题