调用TimeoutFileAction<T>泛型方法时类型参数无法从用法推断如何修复
错误原因
该报错是因为泛型方法TimeoutFileAction<T>的返回类型T需要编译器从传入的委托参数推断类型,但你调用时传入的lambda表达式仅返回null,null没有明确的类型指向,编译器无法判断T的具体类型,因此抛出该错误。
修复方案
方案1:显式指定泛型类型参数
调用方法时直接声明T的实际类型即可,比如你操作的目标是返回文件流,就按照如下格式调用:
// 示例:T为FileStream类型,你可以根据自己的实际返回值替换为对应类型 TimeoutFileAction<FileStream>(() => { // 你的文件操作代码 return null; });
如果你的操作没有返回值,也可以直接指定T为object:
TimeoutFileAction<object>(() => { System.IO.File.etc...; return null; });
方案2:补充无返回值的方法重载
如果你的文件操作本身不需要返回结果,可以额外新增一个适配Action类型参数的重载,后续无返回值的调用就不会出现类型推断问题:
// 新增无返回值的重载 private void TimeoutFileAction(Action func) { var started = DateTime.UtcNow; while ((DateTime.UtcNow - started).TotalMilliseconds < 2000) { try { func(); return; } catch (System.IO.IOException exception) { //忽略,如有需要也可记录日志 } } }
新增后你原来的调用代码不需要修改就可以直接运行。
方案3:明确lambda返回值的类型
在lambda的return语句里给null强转对应类型,让编译器可以自动推断T的类型:
// 示例:返回值类型为string,强转null为string即可 TimeoutFileAction(() => { // 你的文件操作代码 return (string)null; });
内容的提问来源于stack exchange,提问作者electro
相关产品推荐
相关产品推荐

