Причина, по которой вы получаете эту ошибку во время компиляции, состоит в том, что единственное ограничение, которое вы наложили на тип, состоит в том, что он реализует IComparable
, единственный интерфейс, который гарантирует интерфейс, это метод CompareTo
, и не все типы реализуют операторы сравнения.
Поскольку CompareTo
гарантированно будет доступно, однако вы можете использовать его вместо этого.
Также обратите внимание, что вы должны использовать нулевой условный оператор (?.
) при вызове метода CompareTo
, поскольку существует вероятность, что first
равен null
(в этом случае вызов .CompareTo
бросит ArgumentNullException
).
Остальная часть вашего кода также может быть немного упрощена. Во-первых, вы можете немного сократить его, используя троичный оператор (?:
), когда решаете, какой элемент вернуть. И, во-вторых, в операции подкачки вам нужна только одна переменная temp
для хранения значения первой переменной, которую вы переназначаете. Например:
public static T Swap<T>(ref T first, ref T second) where T : IComparable
{
var temp = first;
first = second;
second = temp;
return first?.CompareTo(second) > 0 ? first : second;
}
Вот случай, когда значение null
в противном случае выдает исключение, но с кодом выше оно работает как положено:
string first = null;
string second = "2";
string largest = Swap(ref first, ref second);