Подтвердить что ты не робот

Как я могу вернуть 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)".

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

4b9b3361

Ответ 1

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

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

Ответ 2

return default(T);

Ответ 3

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

where T : class

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

Ответ 4

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

static T FindThing<T>(IList collection, int id) where T : class, IThing, new()

Ответ 5

  • Если у вас есть объект, тогда вам потребуется тип

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

    return default(T);
    

Ответ 6

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

    where T : class
    where T: IList

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

Ответ 7

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

return default(T);

или же

where T : class, IThing
 return null;

Ответ 8

решение 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;
}

Ответ 9

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

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

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

Ответ 10

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

public static TEnum? ParseOptional<TEnum>(this string value) where TEnum : struct
{
    return value == null ? (TEnum?)null : (TEnum) Enum.Parse(typeof(TEnum), value);
}

Ответ 11

Другая альтернатива двум ответам, представленным выше. Если вы измените тип возвращаемого 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
}