我有一个interface<T>. 这个接口有一个方法Compare(T x, T y)。
x永远不可能null。y有很大的机会存在null。
?我想通过在y:上使用 Null 条件运算符来明确这一点Compare(T x, T? y)。
这可能吗?来自哪个版本的 C#?
编辑:
T可以是引用类型和值类型。
我有一个interface<T>. 这个接口有一个方法Compare(T x, T y)。
x永远不可能null。y有很大的机会存在null。?我想通过在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地使用 astruct或 aclass无法编译。这使编译器能够T?清楚地解释。通过为不受约束的类型参数定义以下规则,该限制在 C# 9.0 中被删除T:
如果类型参数为T引用类型,则T?引用相应的可为空的引用类型。例如,如果T是一个string,那么T?是一个string?。
如果 type 参数T是值类型,则T?引用相同的值类型,T。例如,如果T是一个int,T?则也是一个int。
如果类型参数为T可空引用类型,则T?引用相同的可空引用类型。例如,如果T是一个string?,那么T?也是一个string?。
如果类型参数为T可空值类型,则T?引用相同的可空值类型。例如,如果T是一个int?,那么T?也是一个int?。
对于我的问题,这意味着我需要限制T一个类,因为我在 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.
}
比较方法不将参数作为可空类型。它们采用纯实例,然后在方法内部根据预期的行为做出决定。