我有一个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.
}
比较方法不将参数作为可空类型。它们采用纯实例,然后在方法内部根据预期的行为做出决定。