【发布时间】:2020-10-02 10:09:44
【问题描述】:
我的情况与Proper nullable annotation for async generic method that may return default(T)描述的情况类似。
但是,我想知道让调用者知道“返回值”可能为空的正确方法。
public async Task<T> GetAsync<T>()
{
// sometimes returns default(T)!;
}
如果这不是异步方法,我可以使用 MaybeNull 属性。
[return: MaybeNull]
public T Get<T>()
{
// sometimes returns default(T)!;
}
如果它不是通用的,我可以使用? 语法。
public async Task<string?> GetAsync()
{
// sometimes returns default(string)!;
}
有没有办法让调用者知道它可以为空而不添加通用约束?
编辑: 为了澄清,我的意思是让编译器知道任务中的值可能为空。 我想反过来也是正确的。 我最感兴趣的是它应该如何与新的 C# 可为空引用语法一起工作。
我可以做这样的事情就好了
var a = await GetAsync<string?>(); // a is null
var b = await GetAsync<int?>(); // b is null
var c = await GetAsync<string>(); // c is null. Wait string is not supposed to be null and the compiler won't warn you if you use it!
var d = await GetAsync<int>(); // d is 0
编辑: 我可以做这样的事情就好了
var a = await Get<string?>(); // a is null
var b = await Get<int?>(); // b is null
var c = await Get<string>(); // c is null.
var d = await Get<int>(); // d is 0
Nullable reference types: How to specify "T?" type without constraining to class or struct 的建议类似,但可以修改 Box 类以在我无法更改 Task 实现的情况下提供适当的警告。
【问题讨论】:
-
添加 /// 摘要标签?
-
@itsme86,当我说调用者时,我指的是应用于调用代码的编译器
-
您也许可以使用编译器使用的属性。
-
CSharpFunctionalExtensions 包包含一个 Maybe monad。这可能就是您正在寻找的。span>
标签: c# generics async-await nullable-reference-types