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.
Yes the method doesn't get called until the IEnumerable's GetEnumerator method is called.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With