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

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

static T FindThing(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) ».

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

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

  • Возвращает default(T) что означает, что вы вернете null если T является ссылочным типом (или null типом значений), 0 для int, ‘\ 0’ для char и т. Д.
  • Ограничьте T ссылочным типом с ограничением where T : class а затем верните null как обычно
 return default(T); 

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

 where T : class 

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

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

 static T FindThing(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 работает,

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

 static T? FindThing(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(this string value) where TEnum : struct { return value == null ? (TEnum?)null : (TEnum) Enum.Parse(typeof(TEnum), value); } 

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

 static object FindThing(IList collection, int id) { foreach T thing in collecion { if (thing.Id == id) return (T) thing; } return null; // allowed now } 
  • Как получить общий тип во время выполнения?
  • Потенциальное загрязнение кучи по параметру varargs
  • Значение типа 'T' не может быть преобразовано в
  • Получить тип общего параметра в Java с reflectionм
  • Ссылка неоднозначна с дженериками
  • Почему не является массивом общего типа?
  • Общие массивы в Java
  • Получить общий метод без использования GetMethods
  • Тип должен быть ссылочным типом, чтобы использовать его как параметр «T» в общем типе или методе
  • Как сравнить значения родовых типов?
  • Специфическая особенность вывода типа исключения в Java 8
  • Давайте будем гением компьютера.