Я немного поиграюсь с новой функцией С# 8 для обнуляемых ссылочных типов, и во время рефакторинга моего кода я наткнулся на этот (упрощенный) метод:
public T Get<T>(string key)
{
var wrapper = cacheService.Get(key);
return wrapper.HasValue ? Deserialize<T>(wrapper) : default;
}
Теперь это выдает предупреждение " Possible null reference return
что логично, поскольку default(T)
будет давать ноль для всех ссылочных типов. Сначала я думал, что я изменил бы это к следующему:
public T? Get<T>(string key)
Но это не может быть сделано. В нем говорится, что я либо должен добавить общее ограничение, where T: class
или where T: struct
. Но это не вариант, так как это может быть и другое (я могу хранить int
или int?
Или экземпляр FooBar
или что-то еще в кэше). Я также читал о предполагаемом новом родовом ограничении, where class?
но это не похоже на работу.
Единственное простое решение, о котором я могу подумать, - это изменение оператора return с помощью оператора null forgiving:
return wrapper.HasValue ? Deserialize<T>(wrapper) : default!;
Но это кажется неправильным, поскольку оно определенно может быть нулевым, поэтому я вру здесь компилятору :-)
Как я могу это исправить? Я что-то упускаю здесь совершенно очевидно?