Вам не нужны генерики для этого.В то время как концепция «СУХОЙ» делает идею кодирования единственной функции, которая может работать для всех типов, в этом случае вам лучше иметь дискретные функции для каждого числового типа.Все числовые типы известны, и список не слишком велик;скорее всего, есть числовые типы, которые вы на самом деле не собираетесь использовать .Если вы действительно (по какой-либо причине) хотите использовать одну функцию, то единственной реальной опцией является опция IComparable
, к которой вы привязаны, что приводит к печальным (и ненужным) последствиям, приводящим к созданию бокса для числовых параметров.
При этом ваша проблема в том, что у вас не может быть T : decimal, double
, поскольку это означает, что T
должно быть и decimal
и double
(что невозможно), а не то, что оно можетбыть либо одним.
Кроме того, так как это все, что делает эта функция, я, вероятно, в любом случае не буду вызывать функции Math.Max
и Math.Min
.Вероятно, так же просто, если не чуть яснее, написать функции следующим образом:
public static decimal ClipGN(this decimal v, decimal lo, decimal hi)
{
return v <= lo ? lo : v >= hi ? hi : v;
}
И вы сможете дублировать этот код дословно (кроме, конечно, типов возврата и параметров) длякаждый из числовых типов.