gpt4 book ai didi

c# - 具有泛型返回类型的可空引用类型

转载 作者:IT王子 更新时间:2023-10-29 04:31:33 28 4
gpt4 key购买 nike

我正在尝试使用新的 C# 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)将为所有引用类型提供 null。起初我以为我会把它改成下面这样:

public T? Get<T>(string key)

但这是不可能的。它说我要么必须添加一个通用约束 where T : classwhere T : struct .但这不是一个选项,因为它可以是两者(我可以存储 intint?FooBar 的实例或缓存中的任何内容)。我还阅读了一个假定的新通用约束 where class?但这似乎不起作用。

我能想到的唯一简单解决方案是使用null 宽容运算符更改返回语句:

return wrapper.HasValue ? Deserialize<T>(wrapper) : default!;

但这感觉不对,因为它肯定可以为空,所以我基本上是在对编译器撒谎..

我该如何解决这个问题?我是否遗漏了一些非常明显的东西?

最佳答案

你们很亲密。只需像这样编写您的方法:

[return: MaybeNull]
public T Get<T>(string key)
{
var wrapper = cacheService.Get(key);
return wrapper.HasValue ? Deserialize<T>(wrapper) : default!;
}

您必须使用 default! 来消除警告。但是您可以使用 [return: MaybeNull] 告诉编译器它应该检查 null,即使它是不可为 null 的类型也是如此。

在那种情况下,如果开发人员使用您的方法并且不检查空值,他可能会收到警告(取决于流分析)

有关详细信息,请参阅 Microsoft 文档:Specify post-conditions: MaybeNull and NotNull

关于c# - 具有泛型返回类型的可空引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54593923/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com