【发布时间】:2019-07-02 18:50:15
【问题描述】:
我正在尝试使用新的 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<T>(string key)
但这是做不到的。它说我要么必须添加通用约束where T : class 或where T : struct。但这不是一个选项,因为它可以是两者(我可以存储int 或int? 或FooBar 的实例或缓存中的任何内容)。
我还读到了一个假定的新通用约束where class?,但这似乎不起作用。
我能想到的唯一简单的解决方案是使用 null 宽恕运算符来更改 return 语句:
return wrapper.HasValue ? Deserialize<T>(wrapper) : default!;
但这感觉不对,因为它肯定可以为空,所以我在这里基本上是在对编译器撒谎..
我该如何解决这个问题?我在这里遗漏了一些非常明显的东西吗?
【问题讨论】:
-
不能同时编写支持
Nullable<T>和引用类型的方法一直是个问题。这看起来只是该问题的延续。我发现的唯一好的解决方法是同时编写这些方法的Get和GetStruct版本。
标签: c# generics c#-8.0 nullable-reference-types