Je fais la collecte, la mise en œuvre IEnumerable
explicitement et en essayant de itérer de l'intérieur:Attention - ne met pas en œuvre le modèle de « collection »
public class MyCollection<T> : IEnumerable<T>, IEnumerable
{
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
IEnumerator<T> IEnumerable<T>.GetEnumerator() => GetEnumerator();
IEnumerator<T> GetEnumerator() { yield return default(T); } // test
public void Test()
{
foreach (var item in this) { } // here is warning
}
}
Je reçois avertissement du compilateur à this
:
Avertissement CS0279 'MyCollection' n'implémente pas le modèle 'collection'. 'MyCollection.GetEnumerator()' est statique ou non publique.
Enfer oui, ce n'est pas public. Pourquoi ça devrait être? Je peut le rendre public, mais il est pas nécessaire pour foreach
extérieur de type:
foreach (var item in new MyCollection<string>()) { } // no warning
Est-ce que je fais quelque chose de mal?
simplement appeler autre chose? 'GetEnumeratorImpl'? Ou n'utilisez simplement pas l'implémentation d'interface explicite pour 'IEnumerable .GetEnumerator?' –
@JonSkeet, donc c'est seulement un compilateur de noms? – Sinatr
Oui - parce que la correspondance de modèle dans 'foreach' * trouve * la méthode' GetEnumerator() ', mais ne peut pas l'utiliser. Ajout d'une réponse maintenant ... –