C# Nullable 属性 - 通用数组项

Mik*_*sen 6 c# generics nullable-reference-types

注意: 我使用的是 C# 8 的可空引用类型。默认情况下,引用类型不可为空。

假设我有以下方法:

public void TestMethod<T>(T[] items)
{

}
Run Code Online (Sandbox Code Playgroud)

在不使用任何通用约束的情况下,如何使用 Nullable 属性指定数组本身不会为空,但数组中的单个项目可能为空?

我的目标如下:

  • 没有警告,因为数组本身不为空: var len = items.Length;
  • 警告,因为单个项目可以为空: items[0].ToString()
  • 没有警告,因为空合并运算符: items[0]?.ToString()

这段代码似乎表明数组本身可以为空,但是,如果数组本身不为空,那么每个数组项也不为空:

public void TestMethod<T>([MaybeNull]T[] items)
{

}
Run Code Online (Sandbox Code Playgroud)

我知道使用泛型约束可以解决这个问题——因为我可以使用T?[] items——但是,我必须创建两个版本的类——一个用于值类型,一个用于引用类型。有没有办法在使用通用约束的情况下表明这一点?