为什么 List<T> 声明 GetEnumerator() 和 IEnumerable<T>.GetEnumerator()?
Why does List<T> declare GetEnumerator() and IEnumerable<T>.GetEnumerator()?
为什么List要定义这三个方法?
public Enumerator GetEnumerator()
=> new Enumerator(this);
IEnumerator<T> IEnumerable<T>.GetEnumerator()
=> new Enumerator(this);
IEnumerator IEnumerable.GetEnumerator()
=> new Enumerator(this);
他们都在做同样的事情。光有这个还不够吗:
public Enumerator GetEnumerator()
=> new Enumerator(this);
Wouldn't it be enough to just have this:
public Enumerator GetEnumerator()
=> new Enumerator(this);
不,不会,因为那不会实现 IEnumerable<T>
或 IEnumerable
,其中 GetEnumerator()
方法具有 return 类型的 [=15] =] 和 IEnumerator
分别。
return 类型必须匹配才能实现接口。
确实,自己测试这个很容易:
using System.Collections;
using System.Collections.Generic;
public class MyList<T> : IEnumerable<T>
{
public Enumerator GetEnumerator() =>
new Enumerator();
// Implement this fully so we can concentrate on IEnumerable<T>
public struct Enumerator : IEnumerator<T>
{
public T Current => default;
object IEnumerator.Current => default;
public bool MoveNext() => true;
public void Reset() {}
public void Dispose() {}
}
}
给出的错误为:
- 错误 CS0738:'MyList<T>' 没有实现接口成员 'IEnumerable<T>.GetEnumerator()'。 'MyList<T>.GetEnumerator()' 无法实现 'IEnumerable<T>.GetEnumerator()' 因为它没有 'IEnumerator<T>'.
的匹配 return 类型
- 错误 CS0738:'MyList<T>' 没有实现接口成员 'IEnumerable.GetEnumerator()'。 'MyList<T>.GetEnumerator()' 无法实现 'IEnumerable.GetEnumerator()' 因为它没有 'IEnumerator'.
的匹配 return 类型
为什么List要定义这三个方法?
public Enumerator GetEnumerator()
=> new Enumerator(this);
IEnumerator<T> IEnumerable<T>.GetEnumerator()
=> new Enumerator(this);
IEnumerator IEnumerable.GetEnumerator()
=> new Enumerator(this);
他们都在做同样的事情。光有这个还不够吗:
public Enumerator GetEnumerator()
=> new Enumerator(this);
Wouldn't it be enough to just have this:
public Enumerator GetEnumerator() => new Enumerator(this);
不,不会,因为那不会实现 IEnumerable<T>
或 IEnumerable
,其中 GetEnumerator()
方法具有 return 类型的 [=15] =] 和 IEnumerator
分别。
return 类型必须匹配才能实现接口。
确实,自己测试这个很容易:
using System.Collections;
using System.Collections.Generic;
public class MyList<T> : IEnumerable<T>
{
public Enumerator GetEnumerator() =>
new Enumerator();
// Implement this fully so we can concentrate on IEnumerable<T>
public struct Enumerator : IEnumerator<T>
{
public T Current => default;
object IEnumerator.Current => default;
public bool MoveNext() => true;
public void Reset() {}
public void Dispose() {}
}
}
给出的错误为:
- 错误 CS0738:'MyList<T>' 没有实现接口成员 'IEnumerable<T>.GetEnumerator()'。 'MyList<T>.GetEnumerator()' 无法实现 'IEnumerable<T>.GetEnumerator()' 因为它没有 'IEnumerator<T>'. 的匹配 return 类型
- 错误 CS0738:'MyList<T>' 没有实现接口成员 'IEnumerable.GetEnumerator()'。 'MyList<T>.GetEnumerator()' 无法实现 'IEnumerable.GetEnumerator()' 因为它没有 'IEnumerator'. 的匹配 return 类型