提问人:Zenith 提问时间:11/18/2021 最后编辑:Zenith 更新时间:11/18/2021 访问量:296
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
我想通过在 : 上使用 Null 条件运算符来明确这一点。?
y
Compare(T x, T? y)
这是否可能,从哪个版本的 C# 开始?
编辑:
T
可以是引用类型和值类型。
答:
我在@PanagiotisKanavos建议的一份文件中找到了答案:
https://learn.microsoft.com/en-us/dotnet/csharp/nullable-references#generics
在 C# 8.0 中,使用而不约束为 a 或 a 不会编译。这使编译器能够清楚地解释。在 C# 9.0 中,通过为不受约束的类型参数定义以下规则,删除了该限制:T?
T
struct
class
T?
T
如果 的类型参数是引用类型,则引用相应的可为 null 的引用类型。例如,如果 是 ,则为 .
T
T?
T
string
T?
string?
如果 的类型参数是值类型,则引用相同的值类型 。例如,if 是 ,则也是 。
T
T?
T
T
int
T?
int
如果 的类型参数是可为 null 的引用类型,则引用相同的可为 null 的引用类型。例如,如果 是 ,则也是 。
T
T?
T
string?
T?
string?
如果 的类型参数是可以为 null 的值类型,则引用相同的可为 null 的值类型。例如,如果 是 ,则也是 。
T
T?
T
int?
T?
int?
对于我的问题,这意味着我需要将 T
限制在一个类中,因为我使用的是 C#8。
评论
x
null
x
x
null
T?
鉴于在写出这个答案之前,没有提到如果有这样的条件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.
}
比较方法不将参数作为可为 null 的类型。他们采用纯实例,然后在方法内部根据预期的行为进行决策。
评论
T?
Nullable<T>
T
T?
T
int
Nullable<T>
int?
T