在迭代器中访问C#基类会导致ReSharper警告

Sar*_*els 2 c# resharper ienumerable warnings iterator

我有两个班,GenericListSpecificList,其中SpecificList来自继承GenericList. GenericList实现IEnumerable<GenericItem>SpecificList实现IEnumerable<SpecificItem>. SpecificItem继承自GenericItem.我必须GetEnumerator在两者中实施GenericList,SpecificList因为它们实现了IEnumerable<T>.在GenericList,它很容易,我只返回底层的枚举器List<T>:

public IEnumerator<GenericItem> GetEnumerator()
{
    return genericItemsList.GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)

然而,在SpecificList,它似乎更棘手.这似乎有风险投IEnumerator<GenericItem>IEnumerator<SpecificItem>,我不知道这是否会甚至工作.相反,我做了以下事情:

public new IEnumerator<SpecificItem> GetEnumerator()
{
    IEnumerator<GenericItem> enumerator = base.GetEnumerator();
    while (enumerator.MoveNext())
    {
        yield return (SpecificItem)enumerator.Current;
    }
}
Run Code Online (Sandbox Code Playgroud)

这编译很好,一个简单的MSTest单元测试调用SpecificList.GetEnumerator()似乎表明它的工作原理.但是,ReSharper base在上述方法中突出显示以下警告:

通过匿名方法,lambda表达式,查询表达式或迭代器中的'base'关键字访问GenericList.GetEnumerator会导致无法验证的代码

这是我应该担心的吗?我应该采取不同的做法吗?

编辑: 我正在使用ReSharper 5.1完整版预发布版本5.1.1715.35.

此外,我应该暂停运行MSTest单元测试:我只需在Chrome中点击Ctrl+ R,Ctrl+ T即可重新加载页面...

Jar*_*Par 6

R#是正确的,base在3.0版本的C#编译器中访问iterator/lambda中的关键字可能导致无法验证的代码.当它有或没有时有点复杂,我不会试图在这里覆盖它.

解决此问题的最简单方法是将调用包装base.GetEnumerator在另一个非静态私有方法中,并从迭代器中引用该方法.

private IEnumerator<GenericItem> GetBaseEnumerator() {
  return base.GetEnumerator();
}

public new IEnumerator<SpecificItem> GetEnumerator()
{
    IEnumerator<GenericItem> enumerator = GetBaseEnumerator();
    while (enumerator.MoveNext())
    {
        yield return (SpecificItem)enumerator.Current;
    }
}
Run Code Online (Sandbox Code Playgroud)

我相当肯定这个错误是在C#编译器的4.0版本中修复的.