我有这个方法
public static T F<T>(T arg)
{
return arg;
}
我想为F创建一个Func委托。我试试这个
public Func<T, T> FuncF = F;
但它在语法上并不正确。我怎么能这样做。
答案 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
}
}