у меня есть этот метод
public static T F<T>(T arg)
{
return arg;
}
и я хочу создать делегата Func для F. Я пробую это
public Func<T, T> FuncF = F;
но это не синтаксически правильно. Как я могу это сделать.
у меня есть этот метод
public static T F<T>(T arg)
{
return arg;
}
и я хочу создать делегата Func для F. Я пробую это
public Func<T, T> FuncF = F;
но это не синтаксически правильно. Как я могу это сделать.
Только классы и методы могут быть универсальными сами по себе. Поле, использующее универсальные параметры, должно находиться в контексте универсального класса:
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;
}
Вы можете (повторно) предоставлять дженерики только из универсального класса или в универсальном методе. В противном случае вам нужно будет указать определенные типы для 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
}
}
F<int>
— это метод, который можно присвоить переменной Func<int, int>
.
F<double>
— это другой метод, который можно присвоить переменной Func<double, double>
.
Но у вас не может быть общих переменных. С# просто так не работает.
Ближе всего к универсальным переменным является поле универсального класса:
static class DelegateContainer<T>
{
public static Func<T, T> FuncF = F;
}