Dav*_*vid 2 c# generics async-await
我希望使用本文中的提示来推动我的项目的代码覆盖率接近100%.特别是最后一节概述了我无法控制或无法注入的方法的解决方法.Task文章中给出的非泛型版本就像一个魅力,但我在使用通用Task<T>版本时遇到了一些麻烦.
我可能只是遗漏了一些明显的东西.
我的awaiter(为简洁而删除了调试标志)是:
public class EnsureCodeCoverageAwaiter<T> : INotifyCompletion
{
private readonly TaskAwaiter<T> taskAwaiter;
private bool forceAsync;
public EnsureCodeCoverageAwaiter(Task<T> task)
{
this.taskAwaiter = task.GetAwaiter();
this.forceAsync = true;
}
public bool IsCompleted
{
get
{
if (this.forceAsync)
return false;
return this.taskAwaiter.IsCompleted;
}
}
public T GetResult()
{
this.forceAsync = false;
return this.taskAwaiter.GetResult();
}
public void OnCompleted(Action continuation)
{
this.forceAsync = false;
this.taskAwaiter.OnCompleted(continuation);
}
}
Run Code Online (Sandbox Code Playgroud)
我等待的是:
public class EnsureCodeCoverageAwaitable<T>
{
private Task<T> _task;
public EnsureCodeCoverageAwaitable(Task<T> task)
{
_task = task;
}
public EnsureCodeCoverageAwaiter<T> GetAwaiter<T>()
{
return new EnsureCodeCoverageAwaiter<T>(_task);
}
}
Run Code Online (Sandbox Code Playgroud)
根据编译器,问题出在该GetAwaiter<T>方法的最后一行.编译器告诉我:
EnsureCodeCoverageAwaiter(Task <T>)的最佳重载方法匹配具有一些无效参数
如果我使用Visual Studio的工具从同一行"生成构造函数存根",它会生成第二个构造函数,EnsureCodeCoverageAwaiter其中包含与现有构造函数完全相同的签名,并且错误仍然存在.(我可以继续使用相同的工具来生成越来越多相同的构造函数存根.)
当我在构建该行代码时查看intellisense时,构造函数表示它期望a Task<T>和我传递的变量声称是类型Task<T>.
我在这里想念仿制药吗?
这就是问题:
public EnsureCodeCoverageAwaiter<T> GetAwaiter<T>()
Run Code Online (Sandbox Code Playgroud)
您不希望它是引入新类型参数的泛型方法T- 您只想使用该类型的type参数.所以你要:
public EnsureCodeCoverageAwaiter<T> GetAwaiter()
Run Code Online (Sandbox Code Playgroud)
编译器应该给你一个警告:
CS0693:类型
'T'参数与外部类型的类型参数同名'EnsureCoverageAwaitable<T>'
总是检查编译器警告:)
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |