C#中能否将void方法与MapResult方法搭配使用?
解决
MapResult无法推断类型参数的问题 首先咱们得弄明白报错的根源:MapResult的设计逻辑是把不同类型的解析结果统一映射成同一个返回类型,它要求传入的每个处理函数都必须返回相同的TResult类型。但你的Execute()方法返回void——这不是一个能作为泛型参数的实际类型,更像是个“无返回”的标记,所以编译器完全没法自动推断出TResult是什么,自然就抛出了这个类型参数推断失败的错误。
下面给你几个实用的解决方案:
方案1:显式指定TResult为占位类型
既然编译器猜不出来,那咱们直接告诉它用什么类型就行。因为void方法没有返回值,咱们可以用object或者ValueTuple(比如())作为占位,同时显式指定MapResult的泛型参数:
// 假设你的ParserResult是针对AbstractClass的解析结果 parserResult.MapResult<AbstractClass, object>( class1 => { class1.Execute(); return null; }, class2 => { class2.Execute(); return null; }, class3 => { class3.Execute(); return null; } );
这里把每个分支的lambda改成执行Execute()后返回null(作为object类型的占位),同时明确告诉MapResult:第一个参数是解析结果的基类型,第二个是统一的返回类型。
方案2:修改Execute()方法让它返回值
如果可以修改基类的方法,这是最省心的方式——把Execute()的返回类型从void改成一个实际的类型(比如bool表示执行成功与否,或者自定义的结果枚举),这样编译器就能自动推断TResult了:
// 修改基类的Execute方法 public abstract class AbstractClass { public abstract bool Execute(); // 改成返回bool类型 } // 调用时无需额外操作,编译器会自动推断类型 parserResult.MapResult( class1 => class1.Execute(), class2 => class2.Execute(), class3 => class3.Execute() );
方案3:改用Map方法(如果你的解析库支持)
如果你只是想执行Execute()这种“副作用”操作,完全不关心返回值,那可以看看你用的解析库有没有Map方法——它通常专门用来处理无返回值的分支逻辑,不需要统一返回类型:
parserResult.Map( class1 => class1.Execute(), class2 => class2.Execute(), class3 => class3.Execute() );
注:这个方案的前提是你用的解析库(比如System.CommandLine这类)提供了Map方法,如果没有的话还是用前两个方案更稳妥。
内容的提问来源于stack exchange,提问作者rushil bhuptani
相关产品推荐
相关产品推荐

