c# - 为什么 ?? 运算符不能应用于泛型类型,但可以应用空值检查?
问题描述
如果我有一个返回一个T
或某个默认值的通用函数,我想使用??
运算符
T f<T>(T a, T b)
{
return a ?? b;
}
这失败并显示消息
操作员 '??' 不能应用于“T”和“T”类型的操作数
我认为这是因为T
可能不可为空。但我也假设??
上面的操作员应该做同样的事情
T f<T>(T a, T b)
{
var a_ = a;
return a_ != null ? a_ : b;
}
第二个代码编译没有问题。
那么,即使这些案件应该做同样的事情,为什么还要以不同的方式处理呢?
解决方案
这其中的原因是什么??如果左侧的类型是 . ,则旨在解开左侧的类型
Nullable<T>
。换句话说,今天我可以写:int? x ...; int y ...; int z = x ?? y;
因此,“x ?? y”并非转换为“x != null ? x : y”。它可以转换为“x!= null?x.Value:y”。
由于我们不知道 T 是值还是引用类型,所以我们无法有效地进行转换。但是,当 T 被限制为“类”或“结构”(在后一种情况下,是 T?)时,我们可以进行转换。
请参阅该线程的其余部分以进行更广泛的讨论。
有一个关于放松这个的讨论。
推荐阅读
- reactjs - 如何将评级保存到本地存储,使其在刷新后不会消失?
- python - 可以采用 NaN 和 inf 值建议的线性回归库
- node.js - 试图从函数返回一个承诺的值
- swift - 迁移到 Combine 会导致 Snapshotlistener 失败
- python - 如何在远程 Linux shell(Python Admin SDK)中使用 Firebase Admin SDK 服务密钥 JSON 文件?
- swiftui - SwiftUI解码HTML实体报错:同时访问0x7ff43ff29b50,但修改需要独占访问
- python - pandas 数据帧中的对数回报 groupby 股票代码
- python - 如何使用 Python 和 matplotlib 绘制任意数学函数?
- html - 汉堡图标左对齐的响应式菜单
- yaml - git-secret-reveal 在 github 操作上失败