【发布时间】:2017-08-15 12:34:12
【问题描述】:
我正在收集,明确实现IEnumerable 并尝试从内部对其进行迭代:
public class MyCollection<T> : IEnumerable<T>, IEnumerable
{
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
IEnumerator<T> IEnumerable<T>.GetEnumerator() => GetEnumerator();
IEnumerator<T> GetEnumerator() { yield return default(T); } // test
public void Test()
{
foreach (var item in this) { } // here is warning
}
}
我在this 收到编译器警告:
警告 CS0279 'MyCollection' 没有实现 'collection' 模式。 'MyCollection.GetEnumerator()' 要么是静态的,要么是非公开的。
是的,它不公开。为什么应该这样?我可以将其公开,但类型以外的foreach 不需要:
foreach (var item in new MyCollection<string>()) { } // no warning
我做错了吗?
【问题讨论】:
-
就叫别的吧?
GetEnumeratorImpl?或者只是不要为IEnumerable<T>.GetEnumerator?使用显式接口实现 -
@JonSkeet,所以它只是名称 confising 编译器?
-
是的 - 因为
foreach中的模式匹配找到GetEnumerator()方法,但不能使用它。现在添加答案...
标签: c# foreach ienumerable compiler-warnings