Func<object[], int>
и Func<int, int, int>
несовместимы.Поскольку Func<params object[], TResult>
невозможно, единственным способом является определение нескольких перегрузок следующим образом:
static class TestHelper
{
public static bool HashIsTheSame<TResult>(Func<TResult> method1,
Func<TResult> method2) =>
GetHashString(method1()).Equals(method2());
public static bool HashIsTheSame<T, TResult>(Func<T, TResult> method1,
Func<T, TResult> method2,
T arg) =>
GetHashString(method1(arg)).Equals(method2(arg));
public static bool HashIsTheSame<T1, T2, TResult>(Func<T1, T2, TResult> method1,
Func<T1, T2, TResult> method2,
T1 arg1, T2 arg2) =>
GetHashString(method1(arg1, arg2)).Equals(method2(arg1, arg2));
public static bool HashIsTheSame<T1, T2, T3, TResult>(Func<T1, T2, T3, TResult> method1,
Func<T1, T2, T3, TResult> method2,
T1 arg1, T2 arg2, T3 arg3) =>
GetHashString(method1(arg1, arg2, arg3)).Equals(method2(arg1, arg2, arg3));
public static bool HashIsTheSame<T1, T2, T3, T4, TResult>(Func<T1, T2, T3, T4, TResult> method1,
Func<T1, T2, T3, T4, TResult> method2,
T1 arg1, T2 arg2, T3 arg3, T4 arg4) =>
GetHashString(method1(arg1, arg2, arg3, arg4)).Equals(method2(arg1, arg2, arg3, arg4));
public static bool HashIsTheSame<T1, T2, T3, T4, T5, TResult>(Func<T1, T2, T3, T4, T5, TResult> method1,
Func<T1, T2, T3, T4, T5, TResult> method2,
T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5) =>
GetHashString(method1(arg1, arg2, arg3, arg4, arg5)).Equals(method2(arg1, arg2, arg3, arg4, arg5));
// etc. Depends on what number of arguments you believe to make sense.
}
При таком подходе компилируется:
var repo = new Repo();
Assert.IsFalse(TestHelper.HashIsTheSame(repo.TestMethod1, repo.TestMethod2, 1, 2));
Решение 2:
Ваш код не будет компилироваться даже с явными параметрами:
Assert.IsFalse(TestHelper.HashIsTheSame(new Func<object[], int>(repo.TestMethod1), new Func<object[], int>(repo.TestMethod2), 1, 2));
No overload for 'TestMethod1' matches delegate 'Func<object[], int>'
No overload for 'TestMethod2' matches delegate 'Func<object[], int>'
Если выизмените его на:
Assert.IsFalse(TestHelper.HashIsTheSame(new Func<int, int, int>(repo.TestMethod1), new Func<int, int, int>(repo.TestMethod2), 1, 2));
вы получите исходную ошибку:
The type arguments for method 'TestHelper.HashIsTheSame<TResult>(Func<object[], TResult>, Func<object[], TResult>, params object[])' cannot be inferred from the usage. Try specifying the type arguments explicitly.
Но если вы измените HashIsTheSame
:
public static bool HashIsTheSame(MulticastDelegate method1, MulticastDelegate method2, params object[] args)
{
object method1Result = method1.DynamicInvoke(args);
object method2Result = method2.DynamicInvoke(args);
return GetHashString(method1Result).Equals(method2Result);
}
утверждение компилируется и работает. Хотя производительность сейчас стоит вам.