Ограничения параметров типа "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;
}
... Причем это касается всех операторов +, -, <, >, ==.
Какое ограничение типа установить в 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> {}
