2016-01-27 91 views
0

我有一个包装对象列表的类。我希望这个类与foreach循环兼容。让一个类兼容foreach

我看到过几个关于如何在SO上做的问题,但大多数答案都不能为我编译。

class TrackList 
{ 
    private List<Track> tracks = new List<Track>(); 
} 

你会添加什么来使它适用于每个?

到目前为止,我有:

class TrackList : IEnumerable<Track> 
{ 
    // ... 

    public IEnumerator<Track> GetEnumerator() 
    { 
     return trackList.GetEnumerator(); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerator.GetEnumerator() 
    { 
     return this.GetEnumerator(); 
    } 
} 

但它说(翻译错误):

错误1 'HP.TrackList' 未实现接口成员 “System.Collections.IEnumerable .GetEnumerator()”。 'HP.TrackList.GetEnumerator()'无法实现 'System.Collections.IEnumerable.GetEnumerator()',因为它不具有对应于 'System.Collections.IEnumerator'的返回类型。 XXX \ TrackList.cs 11

相反,如果我使用:

IEnumerator<Track> IEnumerator<Track>.GetEnumerator() 
{ 
    return this.GetEnumerator(); 
} 

是给我同样的错误。

+0

为什么你需要迭代类,而不是类的属性? – krillgar

+0

由于其他原因,我不想让轨道作为一个属性可用。您可以迭代列表而不访问该列表的属性,例如名为Items的属性。我想迭代我的曲目列表而不访问属性类(例如)曲目。 – Virus721

+2

请改用'System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()'。 –

回答

6

此行是错误的:

System.Collections.IEnumerator System.Collections.IEnumerator.GetEnumerator() 

你这里有两种类型:

System.Collections.IEnumerator System.Collections.IEnumerator.GetEnumerator() 
^----------------------------^ ^----------------------------^ 
    The type you're returning  The interface you're 
             implementing 

第二个应该是IEnumerableIEnumerator所以使它:

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 

还要注意,您的私人领域:

private List<Track> tracks = new List<Track>(); 

被命名为tracks而不是trackList,我假设这是一个简单的错字,否则您需要修复此错误。

+0

感谢您的回答。因为曲目列表本身就是对象,所以我认为它更有意义。trackList是我为这个类的实例使用的。 – Virus721