VS2015 build échoue sans message d’erreur avec Dynamic

J’écrivais un test unitaire sur un morceau de code qui renvoyait JSON. Le type renvoyé est un type anonyme, alors j’ai pensé vérifier les valeurs dessus. Je viens de lancer l’object sur une dynamic pour faire mes assertions.

Cependant, quand je fais cela, ma construction échoue mais je n’ai aucun message d’erreur. J’ai pu reproduire cela avec un code très simple dans un nouveau projet de test unitaire:

 [TestMethod] public void TestMethod1() { var obj = new { someValue = true }; dynamic asDynamic = obj; Assert.IsTrue(asDynamic.someValue); } 

Voir ci-dessous pour une capture d’écran de la construction échouée

construire en panne

Le build réussit quand je commente l’assertion si:

construire avec succès sans affirmation

En revanche, j’ai exécuté le code suivant dans la version bêta de LinqPad 5 (qui utilise le compilateur Roslyn) et n’avait aucun problème:

 var obj = new { someValue = true }; dynamic asDynamic = obj; Console.WriteLine((asDynamic.someValue == true).ToSsortingng()); 

Vrai

Que se passe t-il ici? Puisque l’erreur ne s’affiche pas, je ne peux pas dire si j’utilise la dynamic manière incorrecte ou si elle ne trouve pas la surcharge à utiliser pour IsTrue() cause de la dynamic ou s’il s’agit d’un bogue dans le compilateur ( Bien que je doute fortement de cela, je n’ai aucune preuve que quelque chose ne va pas avec mon code).

En ce qui concerne le problème de surcharge, j’ai essayé Assert.IsTrue((bool)asDynamic.someValue); mais la construction échoue toujours, toujours pas de message d’erreur.

Selon le commentaire de @ RonBeyer, j’avais aussi essayé plus de casting comme ci-dessous en vain:

  dynamic asDynamic = (dynamic)obj; Assert.IsTrue(((dynamic)asDynamic).someValue); Assert.IsTrue((bool)asDynamic.somevalue); 

En y regardant de plus près, j’ai constaté une erreur dans la fenêtre Sortie:

c: … \ DynamicBuildFailTest \ UnitTest1.cs (16,33,16,42): erreur CS0656: membre du compilateur manquant requirejs ‘Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create’

OK, VS2013 est mieux en mesure de signaler les erreurs, je rechercherai en fonction de ceux-ci:

entrer la description de l'image ici

D’accord, l’ ajout d’une référence à Microsoft.CSharp a corrigé l’erreur de génération , mais je laisserai cette question ouverte car il s’agit probablement d’un problème avec VS2015 qui (dans mon esprit) devrait être résolu.

Il existe une erreur de compilation, Visual Studio 2015 ne signale pas l’erreur correctement. Toutefois, Visual Studio 2013 fait:

Ceci est répondu ici: https://stackoverflow.com/a/13568247 :

En bref:

Ajoutez une référence à Microsoft.CSharp afin d’utiliser la dynamic comme celle-ci.

Comme deux personnes l’ont noté dans les commentaires, pour Net Core et NetStandard, ce problème est parfois résolu en ajoutant une référence NuGet à Microsoft.CSharp .

Il y a un problème connu avec les erreurs de construction qui n’apparaissent pas dans la liste des erreurs. Voir, par exemple, https://github.com/dotnet/roslyn/issues/4567 .

Pour le contourner, dans la fenêtre “Liste des erreurs”, sélectionnez le menu déroulant à droite de “Messages” et sélectionnez “Build + IntelliSense”.

J’ai eu un problème similaire et la seule chose qui m’a résolu était de mettre à jour mon paquet NUnit vers la dernière version.

Au fait, lorsque vous ouvrez la fenêtre Nuget, assurez-vous de ne pas rétrograder votre paquet (lorsque j’ai eu la version 2.0.11, cela m’a montré de passer à la version 2.0.9 qui est en train de rétrograder …)

A eu ce problème en utilisant le mot-clé dynamic en combinaison avec Newtonsoft.json dans un projet .net 3.0.

La solution consistait à supprimer complètement la dynamic et à utiliser JObject à la place:

de

 dynamic locales = JObject.Parse(this.Locales); 

à

 JObject locales = JObject.Parse(this.Locales);