泛型 Class 上的构造函数具有无效参数
Constructor on Generic Class has Invalid Arguments
我希望使用 this article 中的技巧将我的一个项目的代码覆盖率提高到接近 100%。特别是最后一部分概述了我无法控制或无法注入的方法的变通方法。文章中给出的非通用 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 的工具从同一行到 "generate constructor stub",它会在 EnsureCodeCoverageAwaiter
中生成第二个构造函数,其签名与现有构造函数完全相同,并且错误仍然存在。 (我可以继续使用相同的工具来生成越来越多相同的构造函数存根。)
当我在构建那行代码时查看智能感知时,构造函数说它需要一个 Task<T>
并且我传递给它的变量声称是 Task<T>
.[= 类型21=]
我是不是漏掉了关于泛型的一些东西?
这是问题所在:
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>'
始终检查编译器警告:)
我希望使用 this article 中的技巧将我的一个项目的代码覆盖率提高到接近 100%。特别是最后一部分概述了我无法控制或无法注入的方法的变通方法。文章中给出的非通用 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 的工具从同一行到 "generate constructor stub",它会在 EnsureCodeCoverageAwaiter
中生成第二个构造函数,其签名与现有构造函数完全相同,并且错误仍然存在。 (我可以继续使用相同的工具来生成越来越多相同的构造函数存根。)
当我在构建那行代码时查看智能感知时,构造函数说它需要一个 Task<T>
并且我传递给它的变量声称是 Task<T>
.[= 类型21=]
我是不是漏掉了关于泛型的一些东西?
这是问题所在:
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>'
始终检查编译器警告:)