我的情况类似于描述在 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
建议类似于可空引用类型:如何指定“T?”类型而不限制于类或结构,但 Box 类可以修改以在我无法更改 Task 实现时提供适当的警告。