Как я могу вернуть NULL из универсального метода в C #?

static final int safeAdd(int left, int right)
                 throws ArithmeticException {
  if (right > 0 ? left > Integer.MAX_VALUE - right
                : left < Integer.MIN_VALUE - right) {
    throw new ArithmeticException("Integer overflow");
  }
  return left + right;
}

static final int safeSubtract(int left, int right)
                 throws ArithmeticException {
  if (right > 0 ? left < Integer.MIN_VALUE + right
                : left > Integer.MAX_VALUE + right) {
    throw new ArithmeticException("Integer overflow");
  }
  return left - right;
}

static final int safeMultiply(int left, int right)
                 throws ArithmeticException {
  if (right > 0 ? left > Integer.MAX_VALUE/right
                  || left < Integer.MIN_VALUE/right
                : (right < -1 ? left > Integer.MIN_VALUE/right
                                || left < Integer.MAX_VALUE/right
                              : right == -1
                                && left == Integer.MIN_VALUE) ) {
    throw new ArithmeticException("Integer overflow");
  }
  return left * right;
}

static final int safeDivide(int left, int right)
                 throws ArithmeticException {
  if ((left == Integer.MIN_VALUE) && (right == -1)) {
    throw new ArithmeticException("Integer overflow");
  }
  return left / right;
}

static final int safeNegate(int a) throws ArithmeticException {
  if (a == Integer.MIN_VALUE) {
    throw new ArithmeticException("Integer overflow");
  }
  return -a;
}
static final int safeAbs(int a) throws ArithmeticException {
  if (a == Integer.MIN_VALUE) {
    throw new ArithmeticException("Integer overflow");
  }
  return Math.abs(a);
}
501
задан 6 revs, 3 users 71% 5 February 2010 в 14:17
поделиться

6 ответов

Две опции:

  • Возврат default(T), что означает, что Вы возвратитесь null, если T будет ссылочным типом (или nullable тип значения), 0 для int, '\0' для char, и т.д. ( таблица Значений по умолчанию (Ссылка C#) )
  • , Ограничивают T, чтобы быть ссылочным типом с where T : class ограничение и затем возвратиться null как нормальный
876
ответ дан 3 revs, 3 users 50% 5 February 2010 в 14:17
поделиться
return default(T);
77
ответ дан Ricardo Villamil 5 February 2010 в 14:17
поделиться

Ваша другая опция состояла в том, чтобы быть добавить это до конца Вашего объявления:

    where T : class
    where T: IList

Тот путь это позволит Вам возвращать пустой указатель.

6
ответ дан BFree 5 February 2010 в 14:17
поделиться

Добавьте ограничение класса как первое ограничение к Вашему универсальному типу.

static T FindThing<T>(IList collection, int id) where T : class, IThing, new()
12
ответ дан Min 5 February 2010 в 14:17
поделиться

Можно просто скорректировать ограничения:

where T : class

Тогда пустой указатель возврата позволяется.

29
ответ дан 2 revs 5 February 2010 в 14:17
поделиться

Возьмите рекомендацию ошибки... и или пользователь default(T) или new T.

необходимо будет добавить в сравнении в коде, чтобы гарантировать, что это было допустимое соответствие, если Вы идете тем путем.

Иначе, потенциально считайте выходной параметр для "соответствия найденным".

1
ответ дан 2 revs, 2 users 80% 5 February 2010 в 14:17
поделиться
Другие вопросы по тегам:

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