如何使用Func< ...>将基于泛型的方法转换为lambda

时间:2011-12-16 07:45:51

标签: c# generics lambda

如何改变

public static List<T> CreateListOfAnonymous<T>(T unused) {return new List<T>();}
进入lamda。我似乎无法解决这个问题。作为泛型的通用给出错误

即:

Func<T,T> ..... fails because its looking for a real type.

我的目标是使用上述方法中的逻辑,但没有方法,只是在某个方法内部。

3 个答案:

答案 0 :(得分:4)

  

如何将泛型方法转换为lambda?

你没有。 Lambdas不能是通用的。抱歉!这是名义和匿名函数之间的差异之一;匿名函数不能是通用的,名义函数可以。

您能解释一下需要通用匿名方法的场景吗?如果有充分的理由将其添加到语言中,我们可以将其视为假设的未来版本。

答案 1 :(得分:3)

  

我的目标是使用上述方法中的逻辑,但没有方法,只是在某个方法内部。

如果您使用lambda的方法或类型是通用的(因此您的类型具有上下文中的具体内容),那么您可以使其工作:

public void SomeMethod<T>()
{
    Func<T, List<T>> createList = CreateListOfAnonymous;
    var list = createList(default(T));
}

// ...

class SomeClass<T>
{
    public void SomeMethod()
    {
        Func<T, List<T>> createList = CreateListOfAnonymous;
        var list = createList(default(T));
    }
}

如果您的代码都不正确,或者您希望将lambda的T保留为开放式泛型(可能是方法或类的通用参数之外的其他类型),那么就不可能,as leppie mentioned

我发现在过去我想要做这类事情的情况下(avoid repeating myself),我只想在方法中绑定一些类型。所以我只是咬紧牙关,为我想支持的每种类型创建了一个具体版本:

public void SomeMethod()
{
    Func<List<string>> createStringList = () => CreateListOfAnonymous("");
    Func<List<int>> createIntList = () => CreateListOfAnonymous(0);

    var list1 = createStringList();
    var list2 = createStringList();
    var list3 = createStringList();
    var list4 = createIntList();
    var list5 = createIntList();

    // ...
}

答案 2 :(得分:0)

如果我理解正确,那是不可能的。

您不能拥有开放泛型类型的实例。