返回Task<;TResult>;根据其签名,当您返回TResult时不会抛出编译错误

本文关键字:返回 TResult 错误 编译 gt lt Task | 更新日期: 2023-09-27 18:25:26

例如,以下代码编译并运行良好,即使函数签名明确表示它返回Task<int>而不仅仅是int

public async Task<int> GetData(){
    return 1;
}

这是怎么回事?看起来C#将int封装在某种"盒子"中,但当我用自定义类型执行类似操作时,它会引发编译错误。

观察:

public async CustomType<int> GetData(){
    return 1;
}

返回Task<;TResult>;根据其签名,当您返回TResult时不会抛出编译错误

以下代码也是编译时错误"无法将类型'int'隐式转换为'System.Threading.Tasks.Task'"

public Task<int> GetData(){
  return 1;
}

您需要使用async来返回int,如下所示。然而,如果没有任何等待,它将向您发出警告-"此异步方法缺少'await'运算符,将同步运行。请考虑使用'await]运算符等待非阻塞API调用,或使用'await Task.run(…)'在后台线程上执行CPUBound工作"

public async Task<int> GetData() {
        return 1;
}

要返回没有async的任务,您需要使用TaskCompletionSource,如下所示:

public  Task<int> GetData() {
        var result = new TaskCompletionSource<int>();
        result.SetResult(1);
        return result.Task;
}