结构类型的.Net通用约束

时间:2011-10-07 17:41:14

标签: c# .net generics constraints

我正在尝试创建一个泛型类,其实现取决于Int32Int64doublefloatdecimal的类型。

class Calculator<T> where T: int, double, float, decimal

这不对,但我遇到了语法问题

3 个答案:

答案 0 :(得分:8)

  

我正在尝试创建一个泛型类,其实现取决于Int32,Int64,double,float或decimal的类型。

然后它不是泛型。泛型类型是对所有可能的类型参数以相同方式工作的类型,如通用队列或通用字典。

“计算器”类是这类功能最常见的场景;我们一直都会收到此功能请求。我们假设它正在考虑一个尚未公布且不存在的C#的假设未来版本。正确地执行该功能需要来自CLR的假设未来版本的大量支持,该版本尚未公布且不存在。这些情况不是特别高优先级,所以如果没有成功,请不要失望。

有很多方法可以展示这样的功能。例如,我们可以说您可以在接口中放置静态方法。数学运算符是静态方法,因此您可以将类型参数约束为实现静态接口IAddable的类型,或者某些类似的东西。

请记住,Eric对于不存在且可能永远不会存在的未公布产品的未来的任何想法仅仅是为了您的娱乐。

答案 1 :(得分:4)

你做不到。您只能对接口classstruct或空构造函数(new())或基类执行此操作。

请参阅:http://msdn.microsoft.com/en-us/library/d5x73970.aspx

最接近的是struct, IConvertable

我看到的一种技术是使用静态构造函数并抛出断言或异常,但这不是编译时检查,只是运行时。

class Calculator<T>  
   where T : struct
{
   static Calculator()
   {
     Debug.Assert(typeof(T) == typeof(int), "FAIL"); //TODO: extend to other types
   }
}

答案 2 :(得分:4)

您不能在类型参数上指定约束,使其必须是指定的一组类型之一,否。请参阅MSDN for a list of valid constraints

对于那些特定类型,您可以指定:

where T : struct, IComparable, IFormattable, IConvertible,
          IComparable<T>, IEquatable<T>

这可能会很好地限制集合 ,但它也会允许其他原始类型,例如byteulong