如何解决如果 GetEnumerator() 的返回类型不同,IEnumerable.GetEnumerator() 的首选实现如何返回 GetEnumerator()?
我试图理解为什么会出现这样的情况
class Foo : IEnumerable<int>
{
public IEnumerator<int> GetEnumerator()
{
//....
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
不是编译器错误。 GetEnumerator()
返回 IEnumerator<int>
而 IEnumerable.GetEnumerator()
应该返回 IEnumerator
,但它返回通用版本 IEnumerator<int>
,因为它只返回 GetEnumerator();
.很明显不同的返回类型。我在这里错过了什么?
解决方法
正如评论中所指出的,IEnumerator<T>
实现了 IEnumerator
,因此本质上 IE<T>
“是一个”IE
。如果我们这样做可能更容易看到,这很好:
class Foo : IEnumerable<int>
{
private IEnumerator<int> x;
public IEnumerator<int> GetEnumerator()
{
return x;
}
IEnumerator IEnumerable.GetEnumerator()
{
return x;
}
}
如果我们把X的类型改成IEnumerator就不行了:
class Foo : IEnumerable<int>
{
private IEnumerator x;
public IEnumerator<int> GetEnumerator()
{
return x;
}
IEnumerator IEnumerable.GetEnumerator()
{
return x;
}
}
因为虽然 IE<T>
is-a IE
,但它并不意味着 IE
is-a IE<T>
,出于类似的原因,例如一个“字符串是一个对象”但不一定是一个“对象是一个字符串”
如果是这样:
class Lion:IAnimal{}
class Zoo{
Lion GetLion() { }
IAnimal GetAnimal() { return GetLion(); }
}
...你甚至不会质疑它:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。