Общие ограничения - я не уверен, как исправить эту ситуацию с помощью одного или нескольких случаев - PullRequest
5 голосов
/ 18 февраля 2012

В основном у меня есть следующее:

public static bool IsBetween<T>(this T value, T a, T b)
    where T : IComparable
{
    ...
}

public static bool IsBetween<T>(this T value, T a, T b)
    where T : IComparable<T>
{
    ...
}

Проблема в том, что я не могу этого сделать, потому что у вас не может быть члена с одинаковой подписью, даже если ограничения разные.Но нет никакого способа заявить, что ограничение является либо IComparable ИЛИ IComparable<T>.Так что я не уверен, что делать здесь, кроме как выбрать один и пойти с ним.И, независимо от того, какой из них я выберу, я проигрываю другому, потому что они отделены и не наследуют друг от друга (что имеет смысл).

Я что-то здесь упускаю в том, что естьспособ выполнить оба, или мне придется выбрать один (вероятно, универсальная версия)?

Ответы [ 2 ]

8 голосов
/ 18 февраля 2012

Я не понимаю, почему первый метод вообще универсален.Почему это не просто:

public static bool IsBetween(this IComparable value, IComparable left, IComparable right)

Какое значение делает добавление общего метода?Очевидно, что вы не избежите штрафа за бокс, потому что значения будут упакованы при вызове CompareTo(object).

Если у вас нет веских причин сделать метод универсальным, не делайте его универсальным,Тогда у него другая подпись, чем у другого метода, и ваша проблема решена.

3 голосов
/ 18 февраля 2012

В перегрузке разрешения метода .NET не учитываются типы возвращаемых данных и общие ограничения.Поэтому, даже если у IComparable и IComparable<T> есть что-то общее, это все равно не сработает.Просто выберите версию IComparable<T>.Стандартные типы .NET, такие как Int32, Decimal, DateTime, ... в любом случае реализуют оба интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...