使用Func<T,T>委托声明异步方法报错,寻求解决方案
异步方法声明错误的解决办法
我尝试声明以下异步方法:
public static async Task<T> ReadAsync<T>(Func<T,T> read) { return await Task.Run(read); }
执行时出现错误:
Argument 1: cannot convert from 'System.Func<T, T>' to 'System.Action'
我修改成下面的代码后依然报错:
public static async Task<T> ReadAsync<T>(Func<T,T> read) { return await Task.Run(read(T)); }
错误提示:
'T' is a type, which is not valid in the given context
错误原因及修复方案
第一次错误原因
Task.Run的重载中没有直接接受带参Func<T,T>的版本。Func<T,T>是需要传入一个T类型参数、返回T类型结果的委托,而报错提示的Action是无参无返回值的委托,两者类型不匹配,无法转换。
第二次错误原因
read(T)的写法完全错误,T是泛型类型参数,不是具体的实例对象,不能直接作为参数传给委托。
正确写法分两种情况:
如果
read方法不需要输入参数
把委托类型改成Func<T>(无参、返回T),代码如下:public static async Task<T> ReadAsync<T>(Func<T> read) { return await Task.Run(read); }如果
read方法确实需要一个T类型的输入参数
需要在方法里传入这个参数,通过lambda表达式把带参委托包装成无参委托传给Task.Run:public static async Task<T> ReadAsync<T>(Func<T,T> read, T inputValue) { return await Task.Run(() => read(inputValue)); }
内容的提问来源于stack exchange,提问作者Nevir
相关产品推荐
相关产品推荐

