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

标签 c# iterator resharper ienumerable warnings

我有两个类(class),GenericListSpecificList ,其中SpecificList继承自GenericListGenericList实现IEnumerable<GenericItem>SpecificList实现IEnumerable<SpecificItem>SpecificItem继承自GenericItem 。我必须实现GetEnumerator两者皆 GenericListSpecificList因为他们实现了 IEnumerable<T> 。在 GenericList ,这很简单,我只需返回底层的枚举器 List<T> :

public IEnumerator<GenericItem> GetEnumerator()
{
    return genericItemsList.GetEnumerator();
}

但是,在 SpecificList ,看起来比较棘手。类型转换似乎有风险IEnumerator<GenericItem>IEnumerator<SpecificItem> ,我不知道这是否有效。相反,我执行了以下操作:

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

这可以编译良好且简单的 MSTest 单元测试调用 SpecificList.GetEnumerator()似乎表明它有效。然而,ReSharper 强调base在上述方法中出现以下警告:

Access to GenericList.GetEnumerator through 'base' keyword from anonymous method, lambda expression, query expression or iterator results in unverifiable code

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

编辑:我使用的是 ReSharper 5.1 完整版预发布版本 5.1.1715.35。

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

最佳答案

R# 是正确的,在 3.0 版本的 C# 编译器中访问迭代器/lambda 内的 base 关键字可能会导致无法验证的代码。当它出现或不出现时有点复杂,我不会尝试在这里介绍它。

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

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

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

我相当确定这个错误已在 4.0 版本的 C# 编译器中得到修复。

关于c# - 在迭代器中访问 C# 基类会导致 ReSharper 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3136121/

相关文章:

c++ - 我的 map 迭代器无法访问 map 的每个元素,我该如何解决?

r - 在 R 中迭代以拼写检查单词向量

c# - 为什么我的 XML 阅读器读取所有其他元素?

c# - 如何使用 C# 中的 WS Security 来使用 Web 服务并在运行时设置凭据?

c# - 什么是/invokerPRAID?

java - 限制迭代时删除元素

resharper - 如何防止 ReSharper 在添加 using 指令时缩短命名空间?

c# - WebRequest.GetResponse().GetResponseStream() 可以在没有 WebException 的情况下返回 null 吗?

c# - Resharper:可疑的类型转换或检查

C# 扩展方法重载