Yes, delegate types are classes - each concrete delegate type inherits from MulticastDelegate
, and you can pass around delegate references just like you can pass any other kind of reference.
There are various ways in which they're handled specially, by the CLR, framework and language, but those are extra features on top of what normal classes are capable of.
In this particular case, you're using an anonymous method to create an instance of the delegate. You might want to look into lambda expressions which have generally replaced the use of anonymous methods in idiomatic C#, except in a very few cases.