// Func delegate with zero input parameters and one return type
public delegate TResult Func<out TResult>();
// Func delegate with one input parameter and one return type
public delegate TResult Func<in T, out TResult>(T arg);
// Func delegate with two input parameters and one return type
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
// Func delegate with sixteen input parameters and one return type
public delegate TResult Func<in T1, in T2, ..., in T16, out TResult>(
T1 arg1, T2 arg2, ..., T16 arg16);