The only difference is the lambda can be easily cast to Expression<Func<void>>
. The delegates are purely just methods/closures, but the lambda can also be broken down into an expression tree:
Expression<Func<int, int>> expr = x => x*2; // Expression tree
Func<int, int> fun = x => x*2; // Function
delegate int MyDelegate(int x); // Delegate
MyDelegate del = x => x*2; // Same as Function and Delegate