C# 不使用泛型函数调用扩展可枚举

C# 不使用泛型函数调用扩展可枚举,c#,generics,ienumerable,C#,Generics,Ienumerable,想知道为什么我不能这么做 我有一个简单的界面IMapper,用于将一个对象更改为另一个对象,如下所示: public interface IMapper<T> { T Map(); } 然后我决定扩展IEnumerable,这样我就可以在整个枚举中进行扩展。所以我创建了这个函数: public static class EnumerableMapperExtension { public static IEnumerable<TTo> Map(this

想知道为什么我不能这么做

我有一个简单的界面IMapper,用于将一个对象更改为另一个对象,如下所示:

public interface IMapper<T>
{
    T Map();
}
然后我决定扩展IEnumerable,这样我就可以在整个枚举中进行扩展。所以我创建了这个函数:

public static class EnumerableMapperExtension
{
    public static IEnumerable<TTo> Map(this IEnumerable<TFrom> enumerable) where TFrom : IMapper<TTo>
    {
        return enumerable.Select(x => x.Map());
    }
}
除了上面的语法是错误的。它必须是这样的:

var newObject = oldObject.Map();
public static class EnumerableMapperExtension
{
    public static IEnumerable<TTo> Map<TTo, TFrom>(this IEnumerable<TFrom> enumerable) where TFrom : IMapper<TTo>
    {
        return enumerable.Select(x => x.Map());
    }
}
IEnumerable<NewType> newArray = oldArray.Map<NewType, Oldtype>();
所以与其打这个漂亮的电话

IEnumerable<NewType> newArray = oldArray.Map();
我不得不这样称呼它:

var newObject = oldObject.Map();
public static class EnumerableMapperExtension
{
    public static IEnumerable<TTo> Map<TTo, TFrom>(this IEnumerable<TFrom> enumerable) where TFrom : IMapper<TTo>
    {
        return enumerable.Select(x => x.Map());
    }
}
IEnumerable<NewType> newArray = oldArray.Map<NewType, Oldtype>();
是否有任何原因使编译器无法找出枚举文件存储的类型

为清晰起见进行了编辑

var newArray将负担放在方法上,以确定它是什么类型。当您以这样的方式调用泛型方法时,您将使调用者承担提供类型的负担

这可能有助于:

IEnumerable<NewType> gg = oldArray.Map();

但我对泛型的经验是,如果我能让它工作起来,那么像这样的小麻烦是可以推断的,因为第二个参数是为可枚举对象定义的,但是编译器如何知道第一个参数的类型呢?如果无法推断出几个泛型参数中的一个,则必须显式定义所有泛型参数,不可能进行部分推断。如果可以进行部分推断,那么如果存在其他方法,编译器将很难选择正确的泛型重载。您可以使用oldArray.MaptypeofOldType thoughvar newArray将负担放在方法上,以确定它是什么类型-这是错误的。编译器足够聪明,可以在它输出的MSIL中找出并强类型化该方法,因此不会对运行时性能产生影响。不过,可以公平地说,这会给代码维护人员带来负担,让他们去弄清楚,因为它没有那么清楚。