組み込みのコンパイラ変数タイプ:int、float、double、short、...
IsBetweenを実装するにはこれが必要です
public bool IsBetween<T>(this T input) where T : [built-in compiler variable types] {
return false;
}
直接的な方法がない場合は、他の方法でも問題ありません。
組み込み型や数値型は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);
}
「コンパイラ変数型」がプリミティブ型を意味する場合、そのような制限はありません。
構造体を使用してほとんどの組み込み型を許可できますが、独自の構造体を定義することもでき、それが許可されます。
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
すべての値型をカバーするために使用
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
fromからlong
、fromsingle
からなどの演算子間の暗黙的な変換により、double
オプションでそれらの一部を省略して、変換で処理できるようにすることができます。
「組み込みのコンパイラ変数型」が何を意味するのかは明確ではありません。
public bool IsBetween<T>(this T input) where T : struct {
return false;
}
適している可能性があります。