【问题标题】:T current property vs IEnumerator current c#T 当前属性与 IEnumerator 当前 c#
【发布时间】:2020-08-04 19:33:39
【问题描述】:

我实现了 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


    【解决方案1】:

    IEnumerator.Current Property

    给实施者的注意事项

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

    【讨论】:

      【解决方案2】:

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

      因为泛型IEnumerator&lt;T&gt; 继承了非泛型IEnumerator 接口。您需要实现这两个接口,而T Current { get; } 不满足IEnumeratorobject Current { get; } 成员。 (T 可能不是引用类型。)

      第二:当我将调试点放在第二个属性中时,我看到这个属性永远不会执行,当我从这个属性更改返回值时,我的代码中没有任何变化。

      因为您的代码中没有将实例视为IEnumerator;一切都以IEnumerator&lt;T&gt; 的身份访问它。

      如果您将Seller&lt;T&gt; 对象引用分配给IEnumerable不是 IEnumerable&lt;T&gt;),然后在其上编写foreach 循环,您查看调用的 object IEnumerable.Current getter。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-21
        • 2015-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多