首页 > 解决方案 > 为什么 ?? 运算符不能应用于泛型类型,但可以应用空值检查?

问题描述

如果我有一个返回一个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;
}

第二个代码编译没有问题。

那么,即使这些案件应该做同样的事情,为什么还要以不同的方式处理呢?

标签: c#

解决方案


dotnet/csharplang 上的这个问题

这其中的原因是什么??如果左侧的类型是 . ,则旨在解开左侧的类型Nullable<T>。换句话说,今天我可以写:

int? x ...;
int y ...;
int z = x ?? y;

因此,“x ?? y”并非转换为“x != null ? x : y”。它可以转换为“x!= null?x.Value:y”。

由于我们不知道 T 是值还是引用类型,所以我们无法有效地进行转换。但是,当 T 被限制为“类”或“结构”(在后一种情况下,是 T?)时,我们可以进行转换。

请参阅该线程的其余部分以进行更广泛的讨论。

有一个关于放松这个的讨论。


推荐阅读