代码之家  ›  专栏  ›  技术社区  ›  Sarah Vessels

访问迭代器中的C基类会导致Resharper警告

  •  2
  • Sarah Vessels  · 技术社区  · 14 年前

    我有两个班, GenericList SpecificList 在哪里 明细表 继承自 通用表 . 通用表 器具 IEnumerable<GenericItem> 明细表 IEnumerable<SpecificItem> . SpecificItem GenericItem GetEnumerator 明细表 IEnumerable<T> 通用表 List<T>

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

    然而,在 IEnumerator<GenericItem> IEnumerator<SpecificItem>

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

    SpecificList.GetEnumerator() base

    通过匿名方法、lambda表达式、查询表达式或迭代器中的“base”关键字访问genericList.getEnumerator会导致无法验证的代码

    编辑: 我正在使用Resharper 5.1完整版预发行版本5.1.1715.35。

    Also, I should take a break from running MSTest unit tests: I just hit Ctrl键 + R , Ctrl键 + T 在Chrome中重新加载页面…

    2 回复  |  直到 14 年前
        1
  •  6
  •   JaredPar    14 年前

    R正确地访问 base C编译器3.0版本中迭代器/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;
        }
    }
    

    我很确定这个bug是在4.0版本的C编译器中修复的。

        2
  •  0
  •   Anon.    14 年前

    投球似乎有风险 IEnumerator<GenericItem> IEnumerator<SpecificItem> 我不知道这是否可行。

    当然会的。

    return base.Cast<SpecificItem>().GetEnumerator();
    

    风险不比当前的实现高或低。事实上,我很确定在引擎盖下的代码或多或少是相同的。