Как я могу вернуть 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 } 
  • Удалить дубликаты из списка в C #
  • Строка parse для enums типа
  • Внедрить общий макрос свопинга в C
  • C # Общие операторы
  • Как передать параметры Activator.CreateInstance ()
  • Java Generics и Enum, потеря параметров шаблона
  • По какой причине я не могу создавать общие типы массивов в Java?
  • Создание объекта типа параметра
  • Как использовать List to List
  • Дженерики: кастинг и типы значений, почему это незаконно?
  • Почему параметр типа Java не может иметь нижнюю границу?
  • Давайте будем гением компьютера.