Sure, there are plenty of good reasons. The first three to come to mind:
Pretty much any C# programmer will be highly surprised by your extremely uncommon overuse of delegates.
Functions can be virtual
, and can be used to implement interfaces.
Variables, even variables of delegate type, can be re-assigned, which would lead to highly unexpected behaviour.
But there are plenty more.
Eric Lippert mentions in a comment that functions can be overloaded, variables cannot.
Methods can be implemented as iterators (using the yield
keyword), anonymous functions cannot.
Some special methods can be called implicitly: new T { a, b, c }
looks for a method named Add
, not a variable named Add
.
The predefined delegate types do not allow you to use ref
or out
parameters.
The predefined delegate types do not allow you to add attributes to the return type or parameters.