首页 > 解决方案 > 为什么类型推断在这种情况下不起作用?

问题描述

假设我有一个 POCO 和一个 List 类:

class MyClass
{...}

class MyClasses : List<MyClass> 
{...}

IEnumerable<MyClass>以及将 an 映射到列表的以下方法MyClasses

public static TListType ToListOfType<TListType, TItemType>(this IEnumerable<TItemType> list) where TListType : IList<TItemType>, new()
{
    var ret = new TListType();

    foreach (var item in list)
    {
        ret.Add(item);
    }

    return ret;
}

我希望这段代码能够编译,但它不会:

var list = someListOfMyClass.ToListOfType<MyClasses>();

但相反我得到

错误 CS1061“IEnumerable”不包含“ToListOfType”的定义,并且找不到接受“IEnumerable”类型的第一个参数的可访问扩展方法“ToListOfType”(您是否缺少 using 指令或程序集引用?)

但是,这确实有效:

var list = someListOfMyClass.ToListOfType<MyClasses, MyClass>();

我不明白为什么类型推断不足以让编译器知道项目类型是什么,因为this变量是已知类型的列表。

标签: c#

解决方案


类型推断不会从泛型方法调用中推断出缺少的参数。相反,它要么推断所有论点,要么不推断任何论点。因此,您不能使用一种类型参数调用该方法并期望编译器提供其余的。

在这种情况下,可以推断TItemType,因为它在参数之一中。TListType但无法推断,因为它是返回类型。所以最终无法推断方法签名,您必须指定所有类型参数。


推荐阅读