为什么我的C#方法没有被调用?

5
为什么我的下面的X方法没有被调用?!
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;
    }
}

我尝试进入调试器,但它没有进入Xyield break关键字是否引起了我不知道的一些副作用?

如果有价值的话,我正在使用带有.NET 3.5 SP1的Visual Studio 2008 Express。


我已经将示例最小化,仅包含X,删除了X2。 - Hosam Aly
3个回答

13

X2是一个迭代器并且具有延迟执行的特性。直到你尝试从返回的IEnumerable实例中获取值之前,它都不会被真正地运行。你可以将该函数分成两部分来解决这个问题以获得你想要的行为。

   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写了一篇非常好的博客文章,讲述了这个主题:http://blogs.msdn.com/ericlippert/archive/2008/09/08/high-maintenance.aspx


哦,我忘记了那一部分。谢谢。 - Hosam Aly

1

是的,直到调用IEnumerable的GetEnumerator方法,该方法才会被调用。


0

你的Main()方法也需要是public的。否则,其他程序集无法调用你的类的Main()方法作为应用程序的起始点。


1
为什么其他程序集想要调用我的主方法?我想不出任何理由。 - Hosam Aly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接