-1

内置编译器变量类型:int,float,double,short,...
我需要这个来实现 IsBetween

public bool IsBetween<T>(this T input) where T : [built-in compiler variable types] {
    return false;
}

如果没有直接的方法,任何替代方法都可以。

4

5 回答 5

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);
}
于 2013-02-26T18:36:02.233 回答
3

如果“编译器变量类型”是指原始类型,则没有这样的限制:

MSDN - 类型参数的约束

您可以使用 struct 来允许大多数内置类型,但您也可以定义自己的 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;
}
于 2013-02-26T18:35:47.040 回答
2

用于where T : struct覆盖所有值类型

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

于 2013-02-26T18:31:57.000 回答
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;
}

//...

请注意,由于运算符之间的隐式转换,例如 from intto long、 from singletodouble等,您可以选择省略其中的一些并让转换处理它。

于 2013-02-26T18:36:59.207 回答
0

目前尚不清楚“内置编译器变量类型”是什么意思,可能类似于

public bool IsBetween<T>(this T input) where T : struct {
    return false;
}

可能是合适的。

于 2013-02-26T18:33:03.323 回答