是否有一个约束将我的泛型方法限制为数字类型?
任何人都可以告诉我,如果有泛型方法将泛型类型参数T
限制为仅:
Int16
Int32
Int64
UInt16
UInt32
UInt64
我知道where
关键字,但找不到仅用于这些类型的接口,
就像是:
static bool IntegerFunction<T>(T value) where T : INumeric
Hejlsberg在接受Bruce Eckel采访时描述了未实施该功能的原因。
不过,我不得不承认,我不知道他是如何认为他提出的解决方法可行的。 他的提议是将算术运算推迟到其他一些通用类(阅读面试!)。 这有什么帮助? 恕我直言,不是很多。
考虑到这个问题的普及以及这种功能背后的兴趣,我很惊讶地发现T4还没有答案。
在这个示例代码中,我将演示一个非常简单的示例,说明如何使用强大的模板引擎来完成编译器在后台使用泛型进行的工作。
你可以简单地为每个你喜欢的类型生成你想要的函数,并相应地使用它(在编译时!),而不是花时间去做,并且牺牲编译时的确定性。
为此:
<#@ template language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Core" #>
<# Type[] types = new[] {
typeof(Int16), typeof(Int32), typeof(Int64),
typeof(UInt16), typeof(UInt32), typeof(UInt64)
};
#>
using System;
public static class MaxMath {
<# foreach (var type in types) {
#>
public static <#= type.Name #> Max (<#= type.Name #> val1, <#= type.Name #> val2) {
return val1 > val2 ? val1 : val2;
}
<#
} #>
}
而已。 你现在完成了。
保存这个文件会自动将它编译到这个源文件中:
using System;
public static class MaxMath {
public static Int16 Max (Int16 val1, Int16 val2) {
return val1 > val2 ? val1 : val2;
}
public static Int32 Max (Int32 val1, Int32 val2) {
return val1 > val2 ? val1 : val2;
}
public static Int64 Max (Int64 val1, Int64 val2) {
return val1 > val2 ? val1 : val2;
}
public static UInt16 Max (UInt16 val1, UInt16 val2) {
return val1 > val2 ? val1 : val2;
}
public static UInt32 Max (UInt32 val1, UInt32 val2) {
return val1 > val2 ? val1 : val2;
}
public static UInt64 Max (UInt64 val1, UInt64 val2) {
return val1 > val2 ? val1 : val2;
}
}
在你的main
方法中,你可以验证你有编译时的确定性:
namespace TTTTTest
{
class Program
{
static void Main(string[] args)
{
long val1 = 5L;
long val2 = 10L;
Console.WriteLine(MaxMath.Max(val1, val2));
Console.Read();
}
}
}
我会提前一条评论:不,这不违反DRY原则。 DRY原则是为了防止人们在多个地方复制代码,这会导致应用程序难以维护。
在这里并非如此:如果您想要更改,那么您只需更改模板(为您的所有代表提供单一源代码!),然后完成。
为了将它与自定义定义一起使用,请向生成的代码中添加一个名称空间声明(确保它与您定义自己的实现的声明相同),并将该类标记为partial
。 之后,将这些行添加到您的模板文件中,以便将其包含在最终编译中:
<#@ import namespace="TheNameSpaceYouWillUse" #>
<#@ assembly name="$(TargetPath)" #>
说实话:这很酷。
免责声明:这个样本受到了由Manning出版公司的Kevin Hazzard和Jason Bock在.NET中的Metaprogramming的严重影响。
这没有限制。 对于任何想要使用泛型进行数字计算的人来说,这是一个真正的问题。
我会走得更远,并说我们需要
static bool GenericFunction<T>(T value)
where T : operators( +, -, /, * )
甚至
static bool GenericFunction<T>(T value)
where T : Add, Subtract
不幸的是,你只有接口,基类和关键字struct
(必须是值类型), class
(必须是引用类型)和new()
(必须具有默认构造函数)
你可以把这个数字INullable<T>
别的东西(类似于INullable<T>
),就像codeproject上的这个一样。
您可以在运行时应用限制(通过反射操作符或检查类型),但确实丧失了首先使用泛型的优势。
链接地址: http://www.djcxy.com/p/33203.html上一篇: Is there a constraint that restricts my generic method to numeric types?