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



У меня есть общий метод с этим (фиктивным) Кодом (да, я знаю, что 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)' вместо этого."




могу ли я избежать этой ошибки?

409   11  

11 ответов:

два варианта:

  • возвращение default(T) Что означает, что вы вернетесь null если T является ссылочным типом (или типом, поддерживающим значение null), 0 на int,'' на char и т. д.
  • ограничить T, чтобы быть ссылочным типом с where T : class ограничение, а затем вернуться null как обычно
return default(T);

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

where T : class

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

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

static T FindThing<T>(IList collection, int id) where T : class, IThing, new()
  1. если у вас есть объект, то нужно типизировать

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

    return default(T);
    

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

    where T : class
    where T: IList

таким образом, это позволит вам вернуть null.

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

также вы можете архивировать его с помощью нескольких типов value и nullable:

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;
}

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

return default(T);

или

where T : class, IThing
 return null;

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

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

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

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

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

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

Comments

    Ничего не найдено.