У меня есть универсальный класс, который берет тип T
. В этом классе у меня есть метод, были, я должен сравнить тип T
к другому типу T
такой как:
public class MyClass
{
public T MaxValue
{
// Implimentation for MaxValue
}
public T MyMethod(T argument)
{
if(argument > this.MaxValue)
{
// Then do something
}
}
}
Операция сравнения в MyMethod
сбои с Ошибкой компилятора CS0019. Действительно ли возможно добавить ограничение к T
сделать эту работу? Я пытался добавить a where T: IComparable
к определению класса напрасно.
Добавление ограничения, чтобы убедиться, что тип реализует IComparable
, можно использовать. Однако вы не можете использовать оператор <
- интерфейс предоставляет метод CompareTo
, чтобы сделать то же самое:
public class MyClass<T> where T : IComparable<T> {
public T MaxValue {
// Implimentation for MaxValue
}
public T MyMethod(T argument) {
if(argument.CompareTo(this.MaxValue) > 0){
// Then do something
}
}
}
Если вам нужны другие числовые операторы, а не просто сравнение, ситуация более сложная. сложно, потому что вы не можете добавить ограничение для поддержки, например, оператора +
и нет соответствующего интерфейса. Некоторые идеи по этому поводу можно найти здесь .
Нет, это невозможно, ограничения операторов, к сожалению, не разрешены в C #.
где T: IComparable
должен работать нормально, но вы должны использовать другую семантику: метод CompareTo вместо операторов>, <и ==.
На самом деле, здесь не нужно ничего особенного. Comparer
предлагает метод .Compare
, который сделает все, что вам нужно, не требуя никаких дополнительных общих ограничений (которые обычно ужасно распространяются). Он работает как для IComparable
, так и для IComparable
, и поддерживает классы, структуры и Nullable
. Работа выполнена.
Для справки, именно так работают реализации LINQ Max
/ Min
, а также List
. Таким образом, это обычная и хорошо поддерживаемая часть BCL.