Sar*_*els 2 c# resharper ienumerable warnings iterator
我有两个班,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();
}
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即可重新加载页面...
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版本中修复的.