为什么在这种情况下类型推断不起作用?

Jos*_*ank 4 c#

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

class MyClass
{...}

class MyClasses : List<MyClass> 
{...}
Run Code Online (Sandbox Code Playgroud)

和以下方法将映射IEnumerable<MyClass>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;
}
Run Code Online (Sandbox Code Playgroud)

我希望此代码可以编译,但不会:

var list = someListOfMyClass.ToListOfType<MyClasses>();
Run Code Online (Sandbox Code Playgroud)

但是我得到了

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

但是,这确实有效:

var list = someListOfMyClass.ToListOfType<MyClasses, MyClass>();
Run Code Online (Sandbox Code Playgroud)

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

Pat*_*man 5

类型推断不会从通用方法调用中推断出缺少的参数。相反,它要么推断全部的论点。因此,您不能使用一个类型参数来调用该方法,而期望编译器提供其余的参数。

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