【问题标题】:The type arguments for method … cannot be inferred from the usage. Try specifying the type arguments explicitly方法的类型参数……不能从用法中推断出来。尝试明确指定类型参数
【发布时间】:2018-09-03 16:28:52
【问题描述】:

我不确定,为什么打电话给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 列表转换为模型(并返回),但它应该是相同的情况......

【问题讨论】:

  • Map1 中,您很容易让它推断出Fromint,因为这是第一个参数的类型。在Map2,它不知道从哪里开始From
  • 另外,请记住,在Map1Map2调用站点,编译器没有关于如何实现这些方法的信息——它只能工作从方法签名 - 即使它可以进行更深入的检查,演员的方向也是错误的。

标签: c# generics type-inference


【解决方案1】:

因为您定义了object 类型的参数,而MapIntToString 方法的第一个参数类型为int。因此编译器无法确定传递给mapFuncMap2 的参数,即object value 当前持有int 类型的值。如果我们在运行时将其可视化,您的代码将被转换为如下所示的内容,但首先它没有编译,因为它无法解析泛型类型From

Map2<Object, String>(object value, Func<object, String> mapFunc) => mapFunc((object)value);

因此,显然这不起作用,因为您的方法需要 int 类型的参数而不是 object

在这种情况下,您需要明确类型参数,因为编译器不够聪明,无法知道 object value 当前在其中保存 int 类型的值。

【讨论】:

  • 为什么编译器会假定Fromobject 但神奇地知道Tostring?第一个参数不是通用的,因此与推断类型参数无关。最好的情况是你最终会问为什么编译器可以从方法组中推断出 Func&lt;int,?&gt; 的类型,但不能推断出 Func&lt;?,?&gt; 的类型。
【解决方案2】:

显式作品:

var test2 = Map2<int, string>(1, MapIntToString);

var test2 = Map2(1, (Func<int, string>)MapIntToString);

恐怕我无法指出为什么它不能隐式工作的原因。我个人的猜测是MapIntToString 不是单个方法,而是可以毫无问题地转换为Func&lt;int, string&gt; 的方法组(有一个成员),但该转换不用于解析泛型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多