Как я могу вернуть NULL из общего метода в С#?

У меня есть общий метод с этим (фиктивным) кодом (да, я знаю, что у IList есть предикаты, но мой код не использует IList, а какая-то другая коллекция, во всяком случае это не имеет значения для вопроса...)

static T FindThing<T>(IList collection, int id) where T : IThing, new()
{
    foreach T thing in collecion
    {
        if (thing.Id == id)
            return thing;
    }
    return null;  // ERROR: Cannot convert null to type parameter 'T' because it could be a value type. Consider using 'default(T)' instead.
}

Это дает мне ошибку сборки

"Невозможно преобразовать параметр null в тип 'T', потому что это может быть тип значения. Вместо этого используйте" default (T)".

Можно ли избежать этой ошибки?

+465
19 нояб. '08 в 14:51
источник поделиться
11 ответов

Два варианта:

  • Возвращает default(T) что означает, что вы вернете null если T является ссылочным типом (или null типом значений), 0 для int, '\0' для char и т.д. (Таблица значений по умолчанию (ссылка С#))
  • Ограничьте T ссылочным типом с ограничением where T: class а затем верните null как обычно
+814
19 нояб. '08 в 14:59
источник

Связанные вопросы


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

return default(T);
+69
19 нояб. '08 в 14:56
источник

Вы можете просто настроить свои ограничения:

where T : class

Тогда возврат null разрешен.

+24
19 нояб. '08 в 15:01
источник

Добавьте ограничение класса в качестве первого ограничения для вашего общего типа.

static T FindThing<T>(IList collection, int id) where T : class, IThing, new()
+10
19 нояб. '08 в 15:02
источник
  • Если у вас есть объект, тогда вам потребуется тип

    return (T)(object)(employee);
    
  • если вам нужно вернуть null.

    return default(T);
    
+6
06 авг. '12 в 11:15
источник

Другой вариант - добавить это к концу вашего объявления:

    where T : class
    where T: IList

Таким образом, вы сможете вернуть null.

+5
19 нояб. '08 в 15:01
источник

Ниже приведены два варианта, которые вы можете использовать

return default(T);

или же

where T : class, IThing
 return null;
+3
24 сент. '15 в 6:30
источник

решение TheSoftwareJedi работает,

также вы можете архивировать его с помощью пары значений и типов с нулевым значением:

static T? FindThing<T>(IList collection, int id) where T : struct, IThing
{
    foreach T thing in collecion
    {
        if (thing.Id == id)
            return thing;
    }
    return null;
}
+2
02 дек. '11 в 10:11
источник

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

Вам нужно будет добавить сравнение в свой код, чтобы убедиться, что это действительное совпадение, если вы идете по этому маршруту.

В противном случае потенциально рассмотрим выходной параметр для "match found".

+1
19 нояб. '08 в 14:56
источник

Здесь приведен рабочий пример для возвращаемых значений Nullable Enum:

public static TEnum? ParseOptional<TEnum>(this string value) where TEnum : struct
{
    return value == null ? (TEnum?)null : (TEnum) Enum.Parse(typeof(TEnum), value);
}
+1
12 мар. '15 в 1:24
источник

Другая альтернатива двум ответам, представленным выше. Если вы измените тип возвращаемого object на object, вы можете вернуть значение null и в то же время вернуть ненулевой доход.

static object FindThing<T>(IList collection, int id)
{
    foreach T thing in collecion
    {
        if (thing.Id == id)
            return (T) thing;
    }
    return null;  // allowed now
}
0
14 июл. '18 в 12:52
источник

Посмотрите другие вопросы по меткам или Задайте вопрос