不能从用法中推断出方法…的类型参数。尝试显式指定类型参数

时间:2018-09-03 16:28:52

标签: c# generics type-inference

我不确定,为什么打电话给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),但这应该是相同的情况...

2 个答案:

答案 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>,但是该转换不用于解析泛型。