通用contraint我试图创建一个通用类,它的实现依赖于类型为一个Int32
,Int64
,double
,float
,或decimal
。净对结构类型
class Calculator<T> where T: int, double, float, decimal
这是不对的,但我在与语法
通用contraint我试图创建一个通用类,它的实现依赖于类型为一个Int32
,Int64
,double
,float
,或decimal
。净对结构类型
class Calculator<T> where T: int, double, float, decimal
这是不对的,但我在与语法
您不能在类型参数上指定约束条件,使其必须是指定的一组类型之一。请参阅MSDN for a list of valid constraints。
对于特定类型的,你可以指定:
where T : struct, IComparable, IFormattable, IConvertible,
IComparable<T>, IEquatable<T>
这可能会限制设定相当很好,虽然它也允许其他原始类型,如byte
和ulong
。
我正在尝试创建一个通用计算器类,可以用指定的类型进行加,减,乘和除。这使我可以限制Generic类所允许的类型。好答案。 –
你不能这样做的麻烦。你只能这样做是为了一个接口,class
,struct
,或空构造函数(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
}
}
不,你也可以为特定的类做它。例如“where T:Stream”。哦,或者一个类型参数。 –
@JonSkeet我更新了我的答案。 –
难道你不能通过使用'Caclulator'工厂来获得编译时检查吗?方法重载只适用于受支持的类型,并且不给'Calculator'一个公共构造函数? – Brian
我想创建一个泛型类,它的实现取决于类型是Int32,Int64,double,float还是decimal。
然后它不是通用。泛型类型对于所有可能的类型参数都是相同的,例如泛型队列或通用字典。
“计算器”类是像这样的功能给出的最常见的情形;我们始终得到此功能请求。我们假设将它用于假定未来版本的C#,该版本尚未公布并且不存在。做好这个功能需要CLR的一个假想的未来版本的大量支持,这个版本还没有被宣布和不存在。这些情况并不是特别重要,所以请不要失望,如果它不成立。
有多种方式这样的功能可以浮出水面。例如,我们可以说你可以在接口中放置静态方法。数学运算符是静态方法,所以你可以将一个类型参数约束为一个实现静态接口IAddable的类型,或者这样的东西。
记住任何思索埃里克使有关不存在的,并且可能不会存在仅仅是为了您的娱乐发布的产品的未来。
+1票为f#内联功能。运行时反射式创建任何使用上述触发完整的c#编译器(有助于打包成一个你可能认识的人的服务)的东西。即使是反射式的情况下获得调试器的支持也会很棒。是的,我知道它可以被滥用,但该死的,如果它不是很好 – ShuggyCoUk
+1,希望这可以在C#6.0中实现。 – MgSam
如果我屏住呼吸,我不知道哪个会首先存在:一个“完美的,功能完整”的C#版本,或半条命3。 –
无论你正在试图做的是不是在C#中的法律。 – Gabe
好像你应该使用方法重载而不是泛型 –