As JonasH explained in his answer, the compiler won't support this. Let me suggest an alternative solution instead. Let's keep MyFunction as it is (but without the params
):
public static async Task<IEnumerable<T>> MyFunction<T>(
Func<int, int, DateTime[], SomeEntity> mySmallerFunction)
{
...something here;
}
Now when calling MyFunction, you can create a lambda expression which has the desired syntax and convert the array into parameters:
// Calling it with mySmallerFunction(int, int, DateTime)
MyFunction((i1, i2, dts) => mySmallerFunction(i1, i2, dts[0]));
// Calling it with mySmallerFunction(int, int, DateTime, DateTime)
MyFunction((i1, i2, dts) => mySmallerFunction(i1, i2, dts[0], dts[1]));
Obviously, this assumes that your business logic ensures that MyFunction is smart enough to know whether it needs to pass a one-element or two-element array.
Alternatively, you could declare MyFunction to always pass two DateTimes and ignore the second value when appropriate:
public static async Task<IEnumerable<T>> MyFunction<T>(
Func<int, int, DateTime, DateTime, SomeEntity> mySmallerFunction)
{
...something here;
}
// Calling it with mySmallerFunction(int, int, DateTime)
MyFunction((i1, i2, dt1, dt2) => mySmallerFunction(i1, i2, dt1));
// Calling it with mySmallerFunction(int, int, DateTime, DateTime)
MyFunction(mySmallerFunction);
Obviously, you could also move that conversion logic into a second MyFunction overload instead:
public static async Task<IEnumerable<T>> MyFunction<T>(
Func<int, int, DateTime, SomeEntity> mySmallerFunction)
{
return MyFunction<T>((i1, i2, dt1, dt2) => mySmallerFunction(i1, i2, dt1));
}
public static async Task<IEnumerable<T>> MyFunction<T>(
Func<int, int, DateTime, DateTime, SomeEntity> mySmallerFunction)
{
...something here;
}