C# 有没有办法在 T 上放置 Null 条件运算符 (?)?
C# Is there a way to put a Null-conditional operator (?) on 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
约束为 struct
或 class
无法编译。这使编译器能够清楚地解释 T?
。通过为不受约束的类型参数定义以下规则,在 C# 9.0 中删除了该限制:T
:
如果 T
的类型参数是引用类型,则 T?
引用相应的可为 null 的引用类型。例如,如果 T
是 string
,则 T?
是 string?
.
如果 T
的类型参数是值类型,则 T?
引用相同的值类型 T
。例如,如果 T
是 int
,则 T?
也是 int
。
如果 T
的类型参数是可为 null 的引用类型,则 T?
引用相同的可为 null 的引用类型。例如,如果 T
是 string?
,那么 T?
也是 string?
。
如果 T
的类型参数是可为 null 的值类型,则 T?
引用相同的可为 null 的值类型。例如,如果 T
是 int?
,那么 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.
}
比较方法不将参数作为可空类型。他们采用纯实例,然后在方法内部根据预期的行为做出决定。
我有一个 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
约束为 struct
或 class
无法编译。这使编译器能够清楚地解释 T?
。通过为不受约束的类型参数定义以下规则,在 C# 9.0 中删除了该限制:T
:
如果
T
的类型参数是引用类型,则T?
引用相应的可为 null 的引用类型。例如,如果T
是string
,则T?
是string?
.如果
T
的类型参数是值类型,则T?
引用相同的值类型T
。例如,如果T
是int
,则T?
也是int
。如果
T
的类型参数是可为 null 的引用类型,则T?
引用相同的可为 null 的引用类型。例如,如果T
是string?
,那么T?
也是string?
。如果
T
的类型参数是可为 null 的值类型,则T?
引用相同的可为 null 的值类型。例如,如果T
是int?
,那么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.
}
比较方法不将参数作为可空类型。他们采用纯实例,然后在方法内部根据预期的行为做出决定。