C# 有没有办法在 T 上放置 Null 条件运算符 (?)?

C# Is there a way to put a Null-conditional operator (?) on T?

我有一个 interface<T>。这个接口有一个方法 Compare(T x, T y).

我想通过在 y 上使用 Null 条件运算符 ? 来明确这一点:Compare(T x, T? y).

这可能吗?来自哪个版本的 C#?

编辑:

T可以是引用类型和值类型。

我在@PanagiotisKanavos 建议的文档中找到了答案:

https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references#generics

在 C# 8.0 中,使用 T? 而不将 T 约束为 structclass 无法编译。这使编译器能够清楚地解释 T? 。通过为不受约束的类型参数定义以下规则,在 C# 9.0 中删除了该限制:T:

  • 如果 T 的类型参数是引用类型,则 T? 引用相应的可为 null 的引用类型。例如,如果 Tstring,则 T?string?.

  • 如果 T 的类型参数是值类型,则 T? 引用相同的值类型 T。例如,如果 Tint,则 T? 也是 int

  • 如果 T 的类型参数是可为 null 的引用类型,则 T? 引用相同的可为 null 的引用类型。例如,如果 Tstring?,那么 T? 也是 string?

  • 如果 T 的类型参数是可为 null 的值类型,则 T? 引用相同的可为 null 的值类型。例如,如果 Tint?,那么 T? 也是 int?

对于我的问题,这意味着我需要将 T 限制为 class,因为我使用的是 C#8。

鉴于在写这个答案之前,没有提到如果T上有这样的条件

public interface IDoWork<T> : where T: ???
{...}

我们假设它是引用类型

既然假定 T 是引用类型,那么您应该这样做

public int Compare(T x, T y)
{

    if (y == null)
        //Take decision accordingly.
    else
        //Take decision accordingly.
}

比较方法不将参数作为可空类型。他们采用纯实例,然后在方法内部根据预期的行为做出决定。