如何解决特定的‘调用不明确’编译错误?
解决InArgument构造函数的歧义问题
这个歧义坑我之前踩过!编译器之所以纠结,是因为InArgument有两个重载构造函数:一个是泛型的InArgument(T value)(也就是你想调用的那个),另一个是非泛型的InArgument(Activity activity)。当你直接传入new List<Foo>() { foo }时,编译器没法直接判断你要把这个列表当作IEnumerable<Foo>(匹配泛型构造函数),还是尝试往Activity方向做隐式转换(虽然实际转不了,但重载解析时会纳入考虑),于是就抛出了歧义错误。
这里有几种简单的解决办法:
显式强转参数类型
直接把列表强转为你声明的泛型类型IEnumerable<Foo>,给编译器明确的指示:new InArgument<IEnumerable<Foo>>((IEnumerable<Foo>)new List<Foo>() { foo })使用明确类型的中间变量
先把列表赋值给一个类型为IEnumerable<Foo>的变量,再传入构造函数,可读性更强:IEnumerable<Foo> fooCollection = new List<Foo>() { foo }; var myInArgument = new InArgument<IEnumerable<Foo>>(fooCollection);用静态创建方法替代构造函数
很多工作流相关的类型都会提供静态Create方法来避免这类构造函数歧义,InArgument也不例外,这种方式最稳妥:var myInArgument = InArgument<IEnumerable<Foo>>.Create(new List<Foo>() { foo });
我个人更推荐后两种方法,代码更清晰,也能避免后续类似的类型推导问题。
内容的提问来源于stack exchange,提问作者Questionaire
相关产品推荐
相关产品推荐

