Создание метода расширения с нулевым значением T›, как вы это делаете?

У меня возникла ситуация, когда мне нужно сравнить типы, допускающие значение NULL.
Предположим, у вас есть 2 значения:

int? foo=null;
int? bar=4;

Так не пойдет:

if(foo>bar)

Следующее работает, но, очевидно, не для nullable, поскольку мы ограничиваем его типами значений:

public static bool IsLessThan<T>(this T leftValue, T rightValue) where T : struct, IComparable<T>
{
       return leftValue.CompareTo(rightValue) == -1;
}

Это работает, но не является общим:

public static bool IsLessThan(this int? leftValue, int? rightValue)
{
    return Nullable.Compare(leftValue, rightValue) == -1;
}

Как мне сделать универсальную версию моего IsLessThan?

Большое спасибо


person user9969    schedule 03.07.2011    source источник
comment
так вы хотите null ‹ 4 или null › 4 ?   -  person Petar Ivanov    schedule 03.07.2011


Ответы (2)


Попробуй это:

public static bool IsLessThan<T>(this Nullable<T> t, Nullable<T> other) where T : struct
{
    return Nullable.Compare(t, other) < 0;
}
person Sean Thoman    schedule 03.07.2011
comment
Вероятно, вы захотите, чтобы возвращаемое значение читалось как Nullable.Compare(t, other) ‹ 0, чтобы соответствовать документации по сравнению. Предполагается, что метод Compare должен возвращать значение меньше 0 для случая меньше. msdn.microsoft.com/en-us/library/dxxt7t2a.aspx - person PHeiberg; 03.07.2011
comment
@SeanThoman. Спасибо. Это работает. Я написал то, что вы предложили, но не сработало, я, должно быть, написал что-то другое. спасибо - person user9969; 03.07.2011
comment
Я получаю сообщение об исключении, в котором говорится, что тип «T» должен быть ненулевым типом значения, чтобы использовать его в качестве параметра «T» в универсальном типе или методе «Nullable‹T›». - person Kasim Husaini; 30.12.2018

Можно упростить:

public static bool IsLessThan<T>(this T? one, T? other) where T : struct
{
    return Nullable.Compare(one, other) < 0;
}
person Giovani    schedule 18.05.2017