J'essaie d'obtenir le code suivant de compiler mais je reçois des erreurs dans VS2008. Tout le monde peut me dire où je vais mal?
4 Réponses :
Eh bien, la première erreur de compilateur que je reçois est qu'elle se plaint que:
Utilisation du type générique 'System.collections.Generic.Inumerator' nécessite des arguments de type "1" P> blockQuote>
Ceci est à la ligne 16, celui-ci: p>
xxx pré> fixant qui en ajoutant une directive à l'aide de la directive
System.Collections code> Espace de noms (Astuce: Placez le curseur juste après Ienumerator, sur le r em> à la fin du mot et appuyez sur Ctrl +. (Ctrl + la clé de point), il devrait vous suggérer que vous ajoutez un "Utilisation du système .Collections; «Directive, faites cela). P>
alors il compile et fonctionne. Est-ce que cela correspond à ce que vous attendez? P>
En outre, notez que vous devez toujours publier les messages d'erreur réels que vous obtenez, de cette façon, nous n'aborde pas le mauvais arbre s'il y a autre chose mal avec votre code que nous ne voyons pas au premier coup d'œil. p>
En outre, vous pouvez simplifier cette implémentation très courante de
iEnumerable
code> en appelant l'une des méthodes de l'autre, donc je Simplifierait la mise en œuvre des secondes méthodes telles que celle-ci: p> xxx pré> de cette façon, vous ne mettez en place que le code d'énumérateur réel une fois. p>
et enfin voir
Earwicker 's Répondre aussi aussi, cela montre une meilleure façon d'écrire ce code entier. P> P>
+1. La dernière partie de la réutilisation d'une mise en œuvre de l'énumérateur de l'autre est la cerise sur le gâteau.
Pourquoi y a-t-il 2 implémentations de l'énumérateur en premier lieu?
Je ne sais pas pourquoi vous obtenez des erreurs, mais cela ne serait-il pas plus simple?
public static class NumbersSequence { public static IEnumerable<int> Naturals { get { for (int i = 1; i <= 1000; i++) yield return i; } } } class Program { public static void Main(string[] args) { foreach (int i in NumbersSequence.Naturals) Console.WriteLine(i); } }
Tout le monde sait que les chiffres supérieurs à 1 000 sont anormalement élevés.
Pour moi, la distinction entre les nombres «réguliers» et «grands» est à vingt mille. Je suppose que c'est une chose "mise en œuvre".
Vingt mille est incroyablement élevé. Attendez ... Nous parlons des salaires de développeurs ici, des gars droit?
Il est également intéressant de voir le différend de l'âge de l'âge émergeant ici de savoir si les nombres naturels commencent à zéro ou à un!
Si c'est la théorie du numéro, 1 est le seul numéro. Tout le reste est le résultat de l'opérateur successeur.
légèrement hors sujet, mais peut-être intéressant à voir est cette approche:
public static class NumbersSequence { public static IEnumerable<int> Naturals { get { int i = 0; while(true) yield return i++; } } } class Program { static void Main(string[] args) { foreach (int i in NumbersSequence.Naturals.Take(1000)) Console.WriteLine(i); } }
Alors, qu'est-ce que i code> dans
naturals.get code>?
Toujours agréable de voir des boucles "infinies" en action.
Comme le remarqua Pavel, vous avez manqué l'initialisation et l'incrément de i.
Je m'aime de Linq, mais mec, j'oublierais certainement de .take () dans ce cas. Je préférerais que Naturals soit une méthode acceptant un paramètre INT.
Cela ne devrait-il pas être "Rendement retour I ++"?
Ce n'est pas correct - vous devriez déclarer i code> à l'intérieur du
obtenir code>. La façon dont vous l'avez maintenant, une seconde évaluation de
Numérotude des numéros.naturals.take.take (1000) code> retournera les numéros 1000 à 1999. Ce qui devrait être la réponse à
Numéros de numéros.naturals.skip (1000 ) .Take (1000) code>
Au lieu de tandis que (vrai) code>, je ferais
tandis que (i
Lasse a la bonne réponse et je sais que c'est le code d'apprentissage, mais dans l'intérêt de poursuivre votre apprentissage, je veux mentionner deux choses:
énumérable.Range () code> li>
- Prenez le temps de penser à cette mise en œuvre: LI>
ol>
. p> xxx pré> p>
Note, c'est une bonne idée de poster les messages d'erreur que vous obtenez également.