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

标签 c# generics async-await

我希望使用 this article 中的技巧将我的一个项目的代码覆盖率推近 100%。特别是最后一部分概述了我无法控制或无法注入(inject)的方法的变通方法。非泛型 Task文章中给出的版本就像一个魅力,但我在获得通用 Task<T> 时遇到了一些麻烦版本工作。

很可能我只是遗漏了一些明显的东西。

我的服务员(为简洁起见删除了调试标志)是:

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);
    }
}

我等待的是:

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);
    }
}

根据编译器,问题出在 GetAwaiter<T> 的最后一行方法。编译器告诉我:

The best overloaded method match for EnsureCodeCoverageAwaiter(Task<T>) has some invalid arguments

如果我使用 Visual Studio 的工具从同一行“生成构造函数 stub ”,它会在 EnsureCodeCoverageAwaiter 中生成第二个构造函数使用与现有签名完全相同的签名,错误仍然存​​在。 (我可以继续使用相同的工具来生成越来越多相同的构造函数 stub 。)

当我在构建那行代码时查看智能感知时,构造函数说它需要一个 Task<T>我传递给它的变量声称属于 Task<T> 类型.

我是否在这里遗漏了一些有关泛型的信息?

最佳答案

问题是:

public EnsureCodeCoverageAwaiter<T> GetAwaiter<T>()

您不希望它成为引入新类型参数的通用方法 T - 你只想使用类型的类型参数。所以你想要:

public EnsureCodeCoverageAwaiter<T> GetAwaiter()

编译器应该给你一个警告:

CS0693: Type parameter 'T' has the same name as the type parameter from outer type 'EnsureCoverageAwaitable<T>'

始终检查编译器警告:)

关于c# - 泛型类的构造函数具有无效参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27986964/

相关文章:

c# - 通用扩展方法中的嵌套 Func<T, object>

javascript - 异步等待 Promise.all 映射未解析 Promise

javascript - node.js 中的 async/await 理解

c# - BitmapCache 导致 WPF 应用程序锁定

C#递归方法

c# - 覆盖十进制 ToString() 方法

c# - List<CustomClass> 作为 List<T> 发送;如何获得属性?

java - 带有泛型的 Lombok 在 Maven 中失败

Class 的 Java 泛型问题

javascript - 为什么等待代码完成时等待不起作用