迭代器块和继承

Dav*_*nde 16 c# inheritance iterator

给定具有以下接口的基类:

public class Base
{
    public virtual IEnumerable<string> GetListOfStuff()
    {
        yield return "First";
        yield return "Second";
        yield return "Third";
    }
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个覆盖该方法的派生类,并添加自己的东西,如下所示:

public class Derived : Base
{
    public override IEnumerable<string> GetListOfStuff()
    {
        foreach (string s in base.GetListOfStuff())
        {
            yield return s;
        }

        yield return "Fourth";
        yield return "Fifth";
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我受到了警告,"无法验证通过迭代器中的基本关键字访问成员".

那么这个问题的解决方案是什么?

Mar*_*ell 12

怎么样:

public class Derived : Base
{
    public override IEnumerable<string> GetListOfStuff()
    {
        return base.GetListOfStuff().Concat(GetMoreStuff());        
    }
    private IEnumerable<string> GetMoreStuff()
    {
        yield return "Fourth";
        yield return "Fifth";
    }
}
Run Code Online (Sandbox Code Playgroud)


Eri*_*ert 9

顺便提一下,这种奇怪行为的原因是CLR安全团队在v2发布之前就改变了验证者,这使得对来自不同类中的方法的一个类的虚拟方法进行非虚拟调用变得无法验证.

有关此问题的进一步说明,请参阅几年前关于此主题的文章.

http://blogs.msdn.com/ericlippert/archive/2005/11/14/why-are-base-class-calls-from-anonymous-delegates-nonverifiable.aspx

这已经过时了; 我们已经修复了编译器,现在它为你生成帮助器.