Generic constraint to match numeric types
public static bool IsGreaterThan<T>(this T actual, T comp) where T : IComparable<T>
{
return actual.CompareTo(comp) > 0;
}
You can add the struct constraint if you want as well.
It is hard to limit to just numerics, since there is nothing common like INumeric
to use as the filter. Actually, I suspect the easiest approach here is to not insist on the constraint, and use Comparer<T>.Default.Compare
inside the method.
This inbuilt type supports both the generic IComparable<T>
and the non-generic IComparable
, and supports ref-types, value-types and lifted usage via Nullable<T>
.
For full operator usage, look at MiscUtil's Operator
class and GreaterThan
etc, which may be useful if you really want to use the operator (rather than the interface). It also provides access to the other operators like Add
etc.
In this case you want to constrain your generic to the IComparable
interface, which gives you access to the CompareTo
method, since this interface allows you to answer the question ShouldBeGreaterThan
.
Numeric types will implement that interface and the fact that it also works on strings shouldn't bother you that much.
where T : struct,
IComparable,
IComparable<T>,
IConvertible,
IEquatable<T>,
IFormattable
That's the closest I can get to a numeric constraint. All the numeric types implement these 5 interfaces, but IFormattable is not implemented by bool, and strings are a reference type, so they're not applicable.
There's some other things that implement these - DateTime for example, so it's not really as required, but prevents a lot of instantiations you don't want.