0

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

  • x永远不可能null
  • y有很大的机会存在null

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

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

编辑:

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

4

2 回答 2

0

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

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

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

  • 如果类型参数为T引用类型,则T?引用相应的可为空的引用类型。例如,如果T是一个string,那么T?是一个string?

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

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

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

对于我的问题,这意味着我需要限制T一个类,因为我在 C#8 上。

于 2021-11-18T11:53:30.463 回答
0

鉴于在写完这个答案之前,没有提到如果有这样的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.
}

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

于 2021-11-18T12:04:04.330 回答