2014-11-05 58 views
3

我有这样的方法如何创建一个通用的Func键代表

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

,我想一个函数功能委托给F.我试试这个

public Func<T, T> FuncF = F; 

,但它不是语法正确。我如何做到这一点。

+0

似乎没什么问题https://dotnetfiddle.net/JRjFxU – dcastro 2014-11-05 13:57:19

+0

是一个通用的TPE – 2014-11-05 13:58:46

+1

@dcastro您已经添加的东西是不是在原来的问题,这就是为什么它的工作原理。 – 2014-11-05 14:02:37

回答

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

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

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

但是你不能有一个通用变量。 C#就是不这样工作。

的最接近通用的变量是一个通用类的字段:

static class DelegateContainer<T> 
{ 
    public static Func<T, T> FuncF = F; 
} 
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 
    } 
}