Q:

Why can't I pass methods as objects?

Let's say I have:
public void Print() { ... }
public void F(object o) { ... }

now I can do this:
Action a = t.Print;
F(a);

but not:
F(Print);

Why? why is it that I can pass in an Action as an object, but not a method? doesn't all delegates resolve to methods? shouldn't it be the same thing?
Thanks.

A:

There is no implicit conversion to a delegate when castion as an object, because it cannot know what type of delegate to create. For example, Print matches both Action and ThreadStart - and about 40 other delegate types that match the void SomeDelegateName() signature (i.e. no parameters, no return value). Equally, without a delegate type, there is no way to resolve the method group (Print is a method group, not a method) to a single overload.
This works:
F((Action)Print);

Key point: there is absolutely nothing special about Action - it is just a delegate type - and it has the same signature as lots of other delegate types.

