c# - C# 8 在返回具有可空约束的可空泛型时发出警告
问题描述
这段代码:
public T Foo<T>()
where T : class?
{
return null;
}
给出以下错误:
当 'T' 是不可为空的引用类型时,空文字会引入空值
当我们说 T 可以为空时,我不明白为什么我们不能返回 null。如果我们另外尝试返回T?
,我们将得到一个T
不可为空的错误。
似乎不可能同时具有可为空的约束并返回可为空的结果。
解决方案
想象一下你打电话:
string result = Foo<string>();
result
现在包含null
. 但它是 a string
,它不能为空。
编译器警告您Foo<T>
可能会调用 whereT
不可为空,并且null
在这种情况下返回将是意外的。
请注意,这where T : class?
意味着它T
可能是可以为空的,但也可能不是。两者string
都string?
允许。我不相信有任何方法可以说“T
必须可以为空”。
如果你想说:
T
允许为空- 什么时候
T
不可为空,那么这个类型仍然可以返回null
然后你可以写:
[return: MaybeNull]
public T Foo<T>()
where T : class?
{
return null!;
}
请注意,MaybeNull
仅适用于方法的契约而不是它的主体,什么时候我们需要 return null!
。但是,您可以在上面的 SharpLab 链接中看到调用者string result = Foo<string>();
收到了正确的警告。
推荐阅读
- kubernetes - 如何通过 Ingress on BareMetal 部署访问 Kubernetes 集群?
- python - 为什么 stdlib 中迭代器上的组合器不传播长度提示?
- python - Python 包不通过 pip 安装
- r - 从每个节点高效地找到所有可达节点
- php - Laravel:尝试检测一系列十六进制颜色
- amazon-web-services - 托管在 EC2 上的网站无法访问 S3 图像链接
- python - python数据框更改索引类型并删除重复项
- sql-server - VS 2019 无法连接到 SQL Server
- python - pygame 开始运行时出现错误
- assembly - 从 C 到汇编程序的 PTR 错误和偏移量