Ограничения параметров типа "where T : ???"

Есть некоторый интерфейс, являющийся оберткой для неизвестных типов.
Как минимум он наследует System.IEquatable<T>, System.IComparable<T>.
Ниже пример:

public interface IValue<T> :
  System.IComparable<IValue<T>>
  where T : notnull {
  public T Value { get; }
}

Значениями Value, в том числе, могут быть "простые" базовые типы. Например int, double и т.п. Очевидно, что методы сравнения CompareTo(T?) и т.п. можно реализовать для всех Number-типов в абстрактом классе. Но так как тип неизвестен, компилятор выдает ошибку:

введите сюда описание изображения

public abstract class AValueNumber<T> :
  IValue<T>
  where T : notnull {

  public T Value { get; private protected set; }

  public int CompareTo(IValue<T>? other) =>
    (other is AValueNumber<T> v)
      // Error csharp(CS0019) Оператор "<" невозможно применить к операнду типа "T" и "T".
      ? v.Value switch {
        var x when x < Value => 1,
        var x when x > Value => -1,
        _ => 0
        }
      : 1;
}

... Причем это касается всех операторов +, -, <, >, ==.

dotnetfiddle.net

Какое ограничение типа установить в where T : ??? и как это исправить?


Ответы (1 шт):

Автор решения: Alexander Lonberg

Простое решение установить IComparable|IEquatable и не использовать +, -, <, >, ==

public abstract class AValueNumber<T> :
  IValue<T>
  where T : System.IComparable<T>, System.IEquatable<T> {
  public T Value { get; private protected set; }

  public int CompareTo(IValue<T>? other) =>
    (other is AValueNumber<T> v)
      ? Value.CompareTo(v.Value)
      : /* -> ... */;
}

class ValueInt : AValueNumber<int> {}
→ Ссылка