tags:

views:

173

answers:

3

Why is my X method below not being called?!

static class Program
{
    private static void Main()
    {
       X((IEnumerable<int>)null);
    }

    public static IEnumerable<T> X<T>(IEnumerable<T> e)
    {
        if (e == null)
            throw new ArgumentNullException();
        yield break;
    }
}

I tried stepping into the debugger but it doesn't enter X! Is the yield break keyword causing some side effect I am not aware of?

If it's worth anything, I'm using Visual Studio 2008 Express with .NET 3.5 SP1.

+13  A: 

X2 is an iterator and is delayed executed. It won't be actually run until you attempt to get a value from the returned IEnumerable instance. You can fix this to get the behavior you are actually wanting by breaking the function up into 2 parts.

   public static IEnumerable<T> X2<T>(IEnumerable<T> e)
   {
        if (e == null)
            throw new ArgumentNullException();
        return X2Helper(e);
    }

    private static IEnumerable<T> X2Helper<T>(IEnumerable<T> e)
    {
        yield break;
    }

Eric has a great blog post on this subject: http://blogs.msdn.com/ericlippert/archive/2008/09/08/high-maintenance.aspx

JaredPar
Oh, I forgot that part. Thank you.
Hosam Aly
+1  A: 

Yes the method doesn't get called until the IEnumerable's GetEnumerator method is called.

AnthonyWJones
A: 

Your Main() method also needs to be public. Otherwise, other assemblies can't invoke your class's Main() method as the starting point of the application.

sassafrass
Why would other assemblies want to invoke my main method? I can't think of a reason for that.
Hosam Aly