Двоичные операторы сравнения на универсальных типах

У меня есть универсальный класс, который берет тип 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 к определению класса напрасно.

7
задан Brian Triplett 31 March 2010 в 19:13
поделиться

5 ответов

Добавление ограничения, чтобы убедиться, что тип реализует 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 
        } 
    } 
}

Если вам нужны другие числовые операторы, а не просто сравнение, ситуация более сложная. сложно, потому что вы не можете добавить ограничение для поддержки, например, оператора + и нет соответствующего интерфейса. Некоторые идеи по этому поводу можно найти здесь .

9
ответ дан 6 December 2019 в 14:02
поделиться

Нет, это невозможно, ограничения операторов, к сожалению, не разрешены в C #. где T: IComparable должен работать нормально, но вы должны использовать другую семантику: метод CompareTo вместо операторов>, <и ==.

3
ответ дан 6 December 2019 в 14:02
поделиться

Вы должны использовать метод IComparable CompareTo .

2
ответ дан 6 December 2019 в 14:02
поделиться

Это невозможно, но есть обходные пути.

Я разместил свой здесь в другом вопросе.

0
ответ дан 6 December 2019 в 14:02
поделиться

На самом деле, здесь не нужно ничего особенного. Comparer.Default предлагает метод .Compare, который сделает все, что вам нужно, не требуя никаких дополнительных общих ограничений (которые обычно ужасно распространяются). Он работает как для IComparable, так и для IComparable, и поддерживает классы, структуры и Nullable. Работа выполнена.

Для справки, именно так работают реализации LINQ Max / Min, а также List.Sort. Таким образом, это обычная и хорошо поддерживаемая часть BCL.

1
ответ дан 6 December 2019 в 14:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: