我有两个类(class),GenericList
和SpecificList
,其中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();
}
但是,在 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+R、Ctrl+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/