我正在尝试使用新的C# 8可空引用类型功能,并在重构代码时遇到了这个(简化的)方法:
public T Get<T>(string key)
{
var wrapper = cacheService.Get(key);
return wrapper.HasValue ? Deserialize<T>(wrapper) : default;
}
现在,这会给出一个警告
可能的空引用返回
这是合乎逻辑的,因为对于所有引用类型,default(T)将返回null。起初,我想将其更改为以下内容: public T? Get(string key)
但是这是不可能的。它说我要么添加一个泛型约束where T:class或where T:struct。但这不是一个选项,因为它可以是两者(我可以将int或int?或FooBar实例或任何东西存储在缓存中)。 我还读到了一个所谓的新泛型约束where class?,但那似乎行不通。
我唯一能想到的简单解决方案是使用空值运算符更改返回语句:
return wrapper.HasValue ? Deserialize<T>(wrapper) : default!;
但这感觉不对,因为它肯定可以为空,所以我基本上在向编译器撒谎。。
我该如何解决这个问题?我是不是漏掉了某些非常明显的东西?
Nullable<T>
和引用类型一直是一个问题。这似乎只是该问题的延续。我找到的唯一好的解决办法是编写这些方法的Get
和GetStruct
两个版本。 - Dave Cousineau