内置编译器变量类型:int,float,double,short,...
我需要这个来实现IsBetween
public bool IsBetween<T>(this T input) where T : [built-in compiler variable types] {
return false;
}
如果没有直接的方式,任何替代方案都可以。
答案 0 :(得分:6)
对于IsBetween
,您不需要内置类型,也不需要数字类型。您需要带有订单的类型,这意味着实施IComparable<T>
:
public bool IsBetweenInclusive<T>(this T input, T lower, T upper)
where T : IComparable<T>
{
return IsBetweenInclusive(input, lower, upper, Comparer<T>.Default);
}
public bool IsBetweenInclusive<T>(this T input, T lower, T upper, IComparer<T> comparer)
{
return (comparer.Compare(lower,input) <= 0)&&
(comparer.Compare(upper,input) >= 0);
}
答案 1 :(得分:3)
如果“编译器变量类型”是指原始类型,则没有这种限制:
MSDN - Contraints on Type Parameters
您可以使用struct来允许大多数内置类型,但您也可以定义自己的结构,并允许它。
我假设您正在构建IsBetween
以对数字比较a <= x <= b
进行分类。如果这是你的意图,那么通常使用IComparable<T>
。
public static bool IsBetween<T>(this T input, T lower, T upper) where T : IComparable<T> {
return lower.CompareTo(input) < 0 && input.CompareTo(upper) < 0;
}
答案 2 :(得分:2)
使用where T : struct
涵盖所有值类型
答案 3 :(得分:1)
在C#中,没有关于“原始类型”的正式定义;规范中没有提到这样的术语。
没有可以添加的通用约束,它只会将输入限制为基本类型,因为无法知道这些类型可能是什么。
您可以做的最好的方法是为每种类型的方法重载:
public bool IsBetween(this int input)
{
return false;
}
public bool IsBetween(this double input)
{
return false;
}
public bool IsBetween(this float input)
{
return false;
}
//...
请注意,由于运算符之间的隐式转换,例如从int
到long
,从single
到double
等,您可以选择省略其中一些并让转换处理它。
答案 4 :(得分:0)
“内置编译器变量类型”的含义尚不清楚,或许类似
public bool IsBetween<T>(this T input) where T : struct {
return false;
}
可能适合。