【问题标题】:Implementing two generic IEnumerable interfaces with different type parameter实现两个具有不同类型参数的通用 IEnumerable 接口
【发布时间】:2014-08-20 02:06:37
【问题描述】:

有如下代码,得到一个编译错误 - “...没有实现接口成员'System.Collections.IEnumerable.GetEnumerator()'”。

如何实现GetEnumerator的非泛型版本?

public class Giraffe { }
public class Pigeon { }
public class Sample : IEnumerable<Giraffe>, IEnumerable<Pigeon>
{
    IEnumerator<Giraffe> IEnumerable<Giraffe>.GetEnumerator()
    {
        return null;
    }
    IEnumerator<Pigeon> IEnumerable<Pigeon>.GetEnumerator()
    {
        return null;
    }
}

【问题讨论】:

  • 这可能不会特别有用,因为编译器永远无法判断您希望您的人被视为哪个 IEnumerable。
  • 是的,我想是的。看了一篇文章,很好奇如何实现。

标签: c# generics interface


【解决方案1】:

试试:

public class Pets :IEnumerable, IEnumerable<Giraffe>, IEnumerable<Pigeon>
        {
            IEnumerator<Giraffe> IEnumerable<Giraffe>.GetEnumerator()
            {
                return null;
            }
            IEnumerator<Pigeon> IEnumerable<Pigeon>.GetEnumerator()
            {
                return null;
            }

            public IEnumerator GetEnumerator()
            {
                throw new NotImplementedException();
            }
        }

【讨论】:

  • IEnumerator 实际上需要泛型类型。我已经尝试过你的方法,但我遇到了另一个错误。
  • using System.Collection 添加到您的使用列表中。它没有在System.Collection.Generics 命名空间中定义。
  • 在这种情况下你应该抛出一个NotSupportedException(因为设计上不会实现该方法)。
【解决方案2】:

如果我正确理解您的问题,这里有一个示例,您可以如何在您的班级中实现非泛型 Enumerator

public class Sample : IEnumerable<Giraffe>, IEnumerable<Pigeon>
{
    IEnumerator<Giraffe> IEnumerable<Giraffe>.GetEnumerator()
    {
        return null;
    }
    IEnumerator<Pigeon> IEnumerable<Pigeon>.GetEnumerator()
    {
        return null;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return null; //your logic for the enumerator
    }
}

由于泛型 IEnumerable&lt;T&gt; 继承了非泛型 IEnumerable,因此实现 IEnumerable.GetEnumerator 将定义相同的实现。

您还可以将类声明为public class Sample : IEnumerable, IEnumerable&lt;Giraffe&gt;, IEnumerable&lt;Pigeon&gt; 以便更清楚

例子

public class Sample : IEnumerable, IEnumerable<Giraffe>, IEnumerable<Pigeon>
{
    IEnumerator<Giraffe> IEnumerable<Giraffe>.GetEnumerator()
    {
        return null;
    }
    IEnumerator<Pigeon> IEnumerable<Pigeon>.GetEnumerator()
    {
        return null;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return null; //your logic for the enumerator
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多