Как я могу вернуть 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)' вместо этого."
могу ли я избежать этой ошибки?
11 ответов:
два варианта:
- возвращение
default(T)
Что означает, что вы вернетесьnull
если T является ссылочным типом (или типом, поддерживающим значение null),0
наint
,''
наchar
и т. д.- ограничить T, чтобы быть ссылочным типом с
where T : class
ограничение, а затем вернутьсяnull
как обычно
добавить ограничение класса в качестве первого ограничения для универсального типа.
static T FindThing<T>(IList collection, int id) where T : class, IThing, new()
если у вас есть объект, то нужно типизировать
return (T)(object)(employee);
если вам нужно вернуть 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