CSharp对所有内置编译器变量类型的类型约束是什么?

本文关键字:类型 约束 是什么 变量 编译器 内置 CSharp | 更新日期: 2023-09-27 18:01:27

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

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

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

CSharp对所有内置编译器变量类型的类型约束是什么?

对于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);
}

如果"编译器变量类型"指的是基本类型,则没有这样的限制:

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;
}

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

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

在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;
}
//...

请注意,由于操作符之间的隐式转换,例如从intlong,从singledouble等,您可以选择省略其中一些操作符,并让转换处理。

不清楚你所说的"内置编译器变量类型"是什么意思,可能是

之类的东西
public bool IsBetween<T>(this T input) where T : struct {
    return false;
}