class 是什么意思? (class 带问号)在 C# 泛型类型约束中是什么意思?

What does class? (class with question mark) mean in a C# generic type constraint?

当我试图找到另一个问题的答案时,我注意到这段代码是用 C# 编译的:

public void Foo<T>(T obj)
    where T : class?
{
}

我什至没能在文档中找到它的含义。

P.S。显然有人已经决定关闭一个问题,甚至没有弄清楚“重复”并没有真正联系起来。首先尝试弄清楚事情而不是结束问题真的很难吗?副本是关于可为空的原始类型,而可为空的引用类型则完全不同。除了有人看到他们都有一个问号并将问题标记为重复。

它强制 T 必须是可为 null 的引用类型。

您为 T 设置的类型必须派生自 object?

这是 C#8 中的一项新功能,可将类型显式声明为可为空。 如果你有

 Add<T>(T tmp);

你的文档,添加null就可以了;

为了允许您的 class return null 值没有 CS864 警告,您可以稍微重写您的代码

public T? Foo<T>(T obj)
    where T : class
{
    return null;
}

关于 class? 的问题现在开放 GitHub issueclass? 约束尚未实现,因此编译器像常规 class 一样威胁它并暂时生成 A null literal introduces a null value when 'T' is a non-nullable reference type

您还可以参考此 article 中的 T 问题? 部分以查看一些详细信息。上面的代码示例是处理可空泛型类型的推荐方法