为什么我不能用T?作为 C# 中的泛型参数

usr*_*020 1 c# generics .net-core nullable-reference-types

.NET.NET Core控制台应用程序中使用5 。以下代码无法编译:

public class NullableClass<T?> 
{ 
}
Run Code Online (Sandbox Code Playgroud)

错误是:

错误 CS1003 语法错误,“,”预期。

我是否使用任何约束都没有关系。

但这段代码编译:

[return: MaybeNull]
public static T? Find<T>(IEnumerable<T?> sequence, Func<T?, bool> predicate)
{
    foreach (var element in sequence) {
        if (predicate(element)) return element;
    }
    return default(T?);
}
Run Code Online (Sandbox Code Playgroud)

当我声明Find<T?>我有同样的错误。
我在这里不明白什么?

Zoh*_*led 8

如果你想T成为一个可以为空的引用类型,你应该使用一个泛型约束

哪里T:上课?
类型参数必须是引用类型,可以为空或不可为空。此约束也适用于任何类、接口、委托或数组类型。

public class NullableClass<T> where T : class?
{ 
    // code here
}
Run Code Online (Sandbox Code Playgroud)

请注意,问号是约束的一部分 - 还有一个约束class(不带问号)表示“引用类型”,在 c# 8 或更高版本中表示“不可为空的引用类型”。