gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:18:40 26 4
gpt4 key购买 nike

我有两个类(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com