Обнуляемый универсальный метод расширения - PullRequest
0 голосов
/ 19 сентября 2019

Я хочу написать универсальный метод расширения, который выдает ошибку, если нет значения.ТАК Я хочу что-то вроде:

public static T GetValueOrThrow(this T? candidate) where T : class
        {
            if (candidate.HasValue == false)
            {
                throw new ArgumentNullException(nameof(candidate));
            }

            return candidate.Value;
        }
  1. C # не распознает T: Тип или имя пространства имен "T" не может быть найдено
  2. C # не распознает где: Ограниченияне допускается для неуниверсальных объявлений

Есть идеи, если это работает?Чего мне не хватает?

Я также придумываю:

public static T GetValueOrThrow<T>(this T? candidate) where T : class
        {
            if (candidate.HasValue == false)
            {
                throw new ArgumentNullException(nameof(candidate));
            }

            return candidate.Value;
        }

Теперь C # жалуется на кандидата: тип T должен быть типом значения, не допускающим значения NULL, чтобы использовать его в качестве параметраT в универсальном типе или методе Nullable

Это не имеет отношения к сравнению.

1 Ответ

3 голосов
/ 19 сентября 2019
public static T GetValueOrThrow<T>(this Nullable<T> candidate) where T : struct // can be this T? as well, but I think with explicit type is easier to understand
{
    if (candidate.HasValue == false)
    {
        throw new ArgumentNullException(nameof(candidate));
    }
    return candidate.Value;
}

where T : class ограничивается ссылочными типами, которые могут быть нулевыми, но HasValue является свойством Обнуляемый тип (который является типом значения, а также T).

...