2015-09-10 2 views
8

J'ai un certain nombre de projets qui ciblent .NET Micro Framework 4.3.2. Je les ai développés dans Visual Studio 2013. Je viens de passer à Visual Studio 2015, et maintenant je rencontre des problèmes bizarres avec le même code que celui utilisé pour compiler et exécuter.Quand `foreach` a-t-il cessé de travailler sur les chaînes?

Plus précisément, j'ai commencé à obtenir cette erreur:

CS1579 foreach statement cannot operate on variables of type 'string' because 'string' does not contain a public definition for 'GetEnumerator'

Et assez juste, il ne semble pas. Mais cela a fonctionné quand j'ai développé le code. Il est compilé, poussé vers NuGet et travaille sur plusieurs autres projets, donc ça DOIT avoir marché. Alors, pourquoi cela at-il cessé de fonctionner dans Visual Studio 2015? J'ai beaucoup de projets qui utilisent cet idiome pour itérer à travers les caractères dans une chaîne, j'espère que je ne vais pas avoir à les changer tous ... :(

+3

ne semblent pas se reproduire dans un projet d'applications .NET ou .NET pour Windows Store avec le nouveau compilateur et tout ce qui pourrait être un problème de Micro Framework après tout .. – BoltClock

+0

Cela fonctionne certainement: http://rextester.com/BQUY75614 , cela pourrait être un changement dans C# 6 – Jamiec

+0

It wor ks bien pour moi dans VS 2015 avec .NET Framework 4, 4.5 et 4.6. Cela doit être un problème de micro-cadre. –

Répondre

1

J'ai passé en revue le .net micro framework api de here , et j'ai trouvé que la classe String n'a pas une méthode GetEnumerator et comme vous le savez cette méthode est nécessaire pour faire fonctionner la boucle foreach.Je ne sais pas vraiment comment avez-vous compilé le code sur Visual Studio 2013.

+1

Le compilateur C# pré-Roslyn avait un traitement spécial pour les chaînes et l'implémentation de IEnumerable n'était pas requise. C'est un changement de rupture dans le compilateur de Roslyn. Le problème a été migré vers GitHub ici: https://github.com/dotnet/roslyn/issues/11387 Il devrait probablement être réparé dans les deux endroits si l'on place une valeur sur la loi de Postel. –