I can't understand how this is working.
Test expects to get a method with the signature of InterfaceObj as input, but we never pass it in Test2 (the Test itself holds a reference to Actual that implements InterfaceObj and acts as the input, but Test2 doesn't know it.. or is it?)
Actual implements InterfaceObj.
public bool Test(Func<InterfaceObj, bool> pointerToMethod)
{
Actual actual = new Actual();
return pointerToMethod(actual);
}
public bool Test2()
{
return Test(x => x.Test());
}
CodePudding user response:
The type of the lambda parameters can be automatically inferred by the compiler. You could also specify the type explicitly:
public bool Test2()
{
return Test((InterfaceObj x) => x.Test());
}
x => y can be assigned to a Func<T, TResult> with x being type T and y being type TResult.
And since your method Test() only accepts Func<InterfaceObj, bool>, x can only be of type InterfaceObj.
It also works when assigning a variable:
Func<InterfaceObj, bool> myFunction = x => x != null; // x is of type InterfaceObj
The lambda itself is not called, you still need to invoke it:
InterfaceObj obj = ...;
bool result1 = myFunction.Invoke(obj);
// or, shorter:
bool result2 = myFunction(obj);
NB Instead of Func<T, bool>, it is usually better to use the more specific Predicate<T> which also provides more semantic value to callers of your method.
