如何创建通用Func委托

时间:2014-11-05 13:53:33

标签: c# .net delegates func

我有这个方法

    public static T F<T>(T arg)
    {
        return arg;
    }

我想为F创建一个Func委托。我试试这个

public Func<T, T> FuncF = F;

但它在语法上并不正确。我怎么能这样做。

3 个答案:

答案 0 :(得分:6)

只有类和方法本身可以是通用的。使用泛型参数的字段必须位于泛型类上下文中:

public class Test<T>
{
    public static T F(T arg)
    {
        return arg;
    }

    public Func<T, T> FuncF = F;
}

或者,如果F的类型参数不应该连接到FuncF,那么只需为其中一个参数使用不同的名称:

public class Test<T>
{
    public static U F<U>(U arg)
    {
        return arg;
    }

    public Func<T, T> FuncF = F;
}

答案 1 :(得分:1)

F<int>是一种可分配给Func<int, int>变量的方法。

F<double>是一种可分配给Func<double, double>变量的不同方法。

但你不能拥有通用变量。 C#就是这样不行。

与泛型变量最接近的是泛型类的字段:

static class DelegateContainer<T>
{
  public static Func<T, T> FuncF = F;
}

答案 2 :(得分:1)

您只能(重新)从泛型类或泛型方法中公开泛型。否则,您需要为T提供明确的类型(例如,对于局部变量或非泛型类中的字段或属性)。例子:

// I.e. Re-expose by wrapping your Func in a static class:
public static class MyFuncs
{
    public static T F<T>(T arg)
    {
        return arg;
    }
}

public class Generics<T>
{
    // Use it as a field
    private Func<T, T> f = MyFuncs.F;

    // Or getter func
    public Func<T, T> FuncF()
    {
        return MyFuncs.F;
    }
}

// Re-expose generic via Generic Method
public class GenericMethod
{
    public Func<T, T> FuncF<T>()
    {
        return MyFuncs.F;
    }
}


// i.e. Consume the generic and do not re-expose it
public class SpecificClass
{
    public Foo FuncF(Foo f)
    {
        return MyFuncs.F<Foo>(f); // <Foo> is optional - compiler can infer
    }
}