泛型类的构造函数具有无效的参数

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>.

我在这里想念仿制药吗?

Jon*_*eet 7

这就是问题:

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>'

总是检查编译器警告:)

  • @David:我通常将警告设置为错误,使其难以忽略:) (5认同)