Возможно ли в обобщенном методе С# возвращать либо тип объекта, либо тип Nullable?
Например, если у меня есть надежный индексный аксессуар для List
, и я хочу вернуть значение, которое я могу проверить позже с помощью == null
или .HasValue()
.
В настоящее время у меня есть следующие два метода:
static T? SafeGet<T>(List<T> list, int index) where T : struct
{
if (list == null || index < 0 || index >= list.Count)
{
return null;
}
return list[index];
}
static T SafeGetObj<T>(List<T> list, int index) where T : class
{
if (list == null || index < 0 || index >= list.Count)
{
return null;
}
return list[index];
}
Если я попытаюсь объединить методы в один метод.
static T SafeGetTest<T>(List<T> list, int index)
{
if (list == null || index < 0 || index >= list.Count)
{
return null;
}
return list[index];
}
Я получаю ошибку компиляции:
Невозможно преобразовать значение null в тип "T", потому что это может быть тип значения, не равный nullable. Вместо этого используйте "default (T)".
Но я не хочу использовать default(T)
, потому что в случае примитивов 0
, который является значением по умолчанию для int
, является возможным реальным значением, которое мне нужно отличить от недоступного значения,
Возможно ли, чтобы эти методы были объединены в один метод?
(Для записи я использую .NET 3.0, и пока я заинтересован в том, что может сделать более современный С#, я лично смогу использовать ответы, которые работают в версии 3.0)