我实现了IEnumerable和IEnumerator的通用版本。在IEnumerator中,我有两个当前属性1- T电流2-IEnumerator.Current第一:为什么我现在有两个财产?第二:当我在第二个属性中放置调试点时,我看到该属性永远不会执行,并且当我更改此属性的返回值时,我的代码没有任何变化。请有人描述
public class Seller<T> : IEnumerable<T>
{
T[] _array;
public Seller(T[] list)
{
_array = list;
}
public IEnumerator<T> GetEnumerator()
{
return new UserDefinedEnum<T>(_array);
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public class UserDefinedEnum<T> : IEnumerator<T>
{
int _index = -1;
T[] _array;
public UserDefinedEnum(T[] list)
{
_array = list;
}
public T Current
{
get
{
return _array[_index];
}
}
object IEnumerator.Current
{
get
{
return null;
}
}
public void Dispose()
{
}
public bool MoveNext()
{
_index++;
return _index < _array.Length;
}
public void Reset()
{
_index = -1;
}
}
第一:为什么我有两个当前财产?
因为通用IEnumerator<T>
继承了非通用IEnumerator
接口。您需要实现两个接口,并且T Current { get; }
不满足object Current { get; }
的IEnumerator
成员。 (T
可能不是引用类型。)
第二个:当我在第二个属性中放置调试点时,我看到该属性永远不会执行,并且当我从该属性更改返回值时,我的代码也没有改变。
因为您的代码中没有任何内容将实例视为IEnumerator
;一切都以IEnumerator<T>
的身份进行访问。
如果将Seller<T>
对象引用分配给IEnumerable
(not IEnumerable<T>
),然后在其上编写一个foreach
循环,则将看到object IEnumerable.Current
getter被调用。
请参见IEnumerator.Current Property
实施者注意事项
实现此接口需要实现非通用IEnumerator接口。 Current属性出现在两个接口上,并且具有不同的返回类型。将非通用Current属性实现为显式接口实现。这允许非通用接口的任何使用者都可以使用通用接口。