tags:

views:

86

answers:

2

I'm confused why this compiles:

    private delegate int MyDelegate(int p1, int p2);

    private void testDelegate()
    {
        MyDelegate imp = delegate 
        {
            return 1;
        };
    }

MyDelegate should be a pointer to a method that takes two int parameters and returns another int, right? Why am I allowed to assign a method that takes no parameters?

Interestingly, these doesn't compile (it complains about the signature mismatches, as I'd expect)

    private void testDelegate()
    {
        // Missing param
        MyDelegate imp = delegate(int p1)
        {
            return 1;
        };

        // Wrong return type
        MyDelegate imp2 = delegate(int p1, int p2)
        {
            return "String";
        };
    }

Thanks for any help!

Ryan

+3  A: 

Well, in the first sample the compiler can easily see that no parameters are used, and substitute a few dummies.

This looks like a design decision, somewhere on the road from specify-everything in .NET 1, through anonymous methods in .NET 2 to lambdas in .Net 3

Henk Holterman
+2  A: 

Your first example is short-hand syntax if the delegate doesn't need the parameters. If you need even one of them, you need to provide them all, which is why the first part of the second example won't compile.

Niall C.
Thanks a lot for your answer; it makes good sense. I marked the one above as "correct" simply because it got there first. Thank you!
Ryan