在启用nullable的项目中考虑此方法:

public C? GetComponentOrNull<C>() where C : notnull;

目的是C是一个不可为空的类型(无论是值类型,还是不可为空的引用类型),但函数返回该类型的可为空版本.

但很明显这并不像我想要的那样:

var component = GetComponentOrNull<int>();
if (component != null) {
    // ...
}

我在null个比较中得到了一个警告:

表达式的结果总是'false',因为类型'int'的值永远不等于类型(CS0472)'int?"

将鼠标悬停在调用站点上,显示推断的返回类型是int,而不是我预期的int?Nullable<int>.

我试着将返回类型写成Nullable<C>,而不是C?,但后来我得到了一个错误:

类型'C'必须是不可空值类型,才能将其用作泛型类型或方法'Nullable'中的参数'T'(CS0453)

怎么办?我能按我想的方式写吗?

推荐答案

似乎?可空后缀被编译器删除时降低代码,你可以看到它是如何工作的here.请注意,在降低的代码中,该方法实际上并没有返回一个可为空的值,甚至删除了if语句.但是,如果将泛型类型约束为struct,编译器现在知道如何重写代码.

一个更安全,(可以说)更可读的代码编写方法是借鉴BCL做这类事情的方式,并使用Try...(our T value)方法.例如:

public bool TryGetComponent<C>(out C? component)
{
    component = default!;
    return false;
}

Csharp相关问答推荐

获取Windows和Linux上的下载文件夹

无法从具有一对多关系的C#类中使用Swagger创建记录

为什么我的ASP.NET核心MVC应用程序要为HTML元素添加一些标识符?

在C#中,DirectoryEntry返回空AuditRules集合,即使审计规则确实存在

C#.NET依赖项注入顺序澄清

从依赖项容器在.NET 8中的Program.cs文件中添加IOC

C#-从基类更新子类

共享暂存/生产环境中Azure事件中心的建议配置

Cosmos SDK和Newtonsoft对静态只读记录的可能Mutations

CS1660无法将lambda表达式转换为类型INavigationBase,因为它不是委托类型

CA1508:';NULL=>;TRUE;始终为';TRUE';.移除或重构条件(S)以避免死代码

Lambda表达式如何与隐式强制转换一起工作?

如何在Polly重试策略成功之前将HttpClient请求排队?

C#命名管道-编码错误?

try 创建一个C#程序,该程序使用自动实现的属性、覆盖ToString()并使用子类

C#中使用ReadOnlySpan的泛型类型推理

C#USB条形码 scanner 在第二次扫描时未写入行尾字符

从HTML元素获取 colored颜色

根据优先级整理合同列表

如何在C#中抽象Vector256;T<;的逻辑以支持不同的硬件配置?