T当前属性与IEnumerator当前c#

问题描述 投票:0回答:2

我实现了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;
    }
}
c# ienumerable ienumerator
2个回答
2
投票

第一:为什么我有两个当前财产?

因为通用IEnumerator<T>继承了非通用IEnumerator接口。您需要实现两个接口,并且T Current { get; }不满足object Current { get; }IEnumerator成员。 (T可能不是引用类型。)

第二个:当我在第二个属性中放置调试点时,我看到该属性永远不会执行,并且当我从该属性更改返回值时,我的代码也没有改变。

因为您的代码中没有任何内容将实例视为IEnumerator;一切都以IEnumerator<T>的身份进行访问。

如果将Seller<T>对象引用分配给IEnumerablenot IEnumerable<T>),然后在其上编写一个foreach循环,则看到object IEnumerable.Current getter被调用。


0
投票

请参见IEnumerator.Current Property

实施者注意事项

实现此接口需要实现非通用IEnumerator接口。 Current属性出现在两个接口上,并且具有不同的返回类型。将非通用Current属性实现为显式接口实现。这允许非通用接口的任何使用者都可以使用通用接口。

© www.soinside.com 2019 - 2024. All rights reserved.