我不确定,为什么打电话给Map2
会给我
方法'Program.Map2(object, 无法从用法中推断出Func)'。尝试指定 明确键入参数。
这是代码...
void Test()
{
var test1 = Map1(1, MapIntToString);
var test2 = Map2(1, MapIntToString);
}
To Map1<From, To>(From value, Func<From, To> mapFunc) => mapFunc(value);
To Map2<From, To>(object value, Func<From, To> mapFunc) => mapFunc((From)value);
string MapIntToString(int value) => Convert.ToString(value);
这是非常简化的示例。我需要将DTO的一些列表转换为Models(然后再转换为Models),但这应该是相同的情况...
答案 0 :(得分:1)
因为您已经定义了类型object
的参数,而方法MapIntToString
的第一个参数类型为int
。因此,编译器无法确定为mapFunc
传递给Map2
的参数,即object value
当前持有类型为int
的值。如果我们在运行时将其解析时将其可视化,则您的代码将被翻译为以下内容,但由于无法解析通用类型From
,该代码最初并未编译:
Map2<Object, String>(object value, Func<object, String> mapFunc) => mapFunc((object)value);
因此,很显然,这将无法正常工作,因为您的方法希望参数类型为int
而不是object
。
在这种情况下,您需要明确说明类型参数,因为Compiler不够聪明,无法知道object value
当前在其中保存着int
类型的值。
答案 1 :(得分:0)
成为露骨作品:
var test2 = Map2<int, string>(1, MapIntToString);
或
var test2 = Map2(1, (Func<int, string>)MapIntToString);
恐怕我不能指出为什么无法隐式工作的原因。我个人的猜测是,MapIntToString
不是单个方法,而是一个方法组(具有一个成员),可以毫无问题地转换为Func<int, string>
,但是该转换不用于解析泛型。