2011-10-07 95 views
1

通用contraint我试图创建一个通用类,它的实现依赖于类型为一个Int32Int64doublefloat,或decimal净对结构类型

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

这是不对的,但我在与语法

+0

无论你正在试图做的是不是在C#中的法律。 – Gabe

+0

好像你应该使用方法重载而不是泛​​型 –

回答

4

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

对于特定类型的,你可以指定:

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

这可能会限制设定相当很好,虽然它也允许其他原始类型,如byteulong

+0

我正在尝试创建一个通用计算器类,可以用指定的类型进行加,减,乘和除。这使我可以限制Generic类所允许的类型。好答案。 –

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 
    } 
} 
+0

不,你也可以为特定的类做它。例如“where T:Stream”。哦,或者一个类型参数。 –

+0

@JonSkeet我更新了我的答案。 –

+0

难道你不能通过使用'Caclulator'工厂来获得编译时检查吗?方法重载只适用于受支持的类型,并且不给'Calculator'一个公共构造函数? – Brian

8

我想创建一个泛型类,它的实现取决于类型是Int32,Int64,double,float还是decimal。

然后它不是通用。泛型类型对于所有可能的类型参数都是相同的,例如泛型队列或通用字典。

“计算器”类是像这样的功能给出的最常见的情形;我们始终得到此功能请求。我们假设将它用于假定未来版本的C#,该版本尚未公布并且不存在。做好这个功能需要CLR的一个假想的未来版本的大量支持,这个版本还没有被宣布和不存在。这些情况并不是特别重要,所以请不要失望,如果它不成立。

有多种方式这样的功能可以浮出水面。例如,我们可以说你可以在接口中放置静态方法。数学运算符是静态方法,所以你可以将一个类型参数约束为一个实现静态接口IAddable的类型,或者这样的东西。

记住任何思索埃里克使有关不存在的,并且可能不会存在仅仅是为了您的娱乐发布的产品的未来。

+1

+1票为f#内联功能。运行时反射式创建任何使用上述触发完整的c#编译器(有助于打包成一个你可能认识的人的服务)的东西。即使是反射式的情况下获得调试器的支持也会很棒。是的,我知道它可以被滥用,但该死的,如果它不是很好 – ShuggyCoUk

+0

+1,希望这可以在C#6.0中实现。 – MgSam

+0

如果我屏住呼吸,我不知道哪个会首先存在:一个“完美的,功能完整”的C#版本,或半条命3。 –