web-dev-qa-db-fra.com

La génération VS2015 échoue sans message d'erreur avec Dynamic

J'écrivais un test unitaire sur un morceau de code qui a retourné JSON. Le type renvoyé est un type anonyme. J'ai donc pensé à vérifier les valeurs. Je convertissais simplement l'objet en dynamic pour effectuer mes assertions.

Cependant, lorsque je le fais, 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 l'échec de la construction

 build failing

La construction réussit quand je commente l'affirmation:

 build succeeding without assert

En revanche, j'ai exécuté le code suivant dans LinqPad 5 beta (qui utilise le compilateur Roslyn) et je n’avais aucun problème:

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

Vrai

Que se passe t-il ici? Comme l'erreur ne montre pas, je ne peux pas dire si j'utilise dynamic de manière incorrecte, ou s'il 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 J'en doute fortement, je n'ai aucune preuve qu'il y a quelque chose qui ne va pas dans 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.

Par commentaire de @ RonBeyer, j'avais également essayé plus de casting comme ci-dessous en vain:

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

    Assert.IsTrue((bool)asDynamic.somevalue);

En regardant de plus près, j'ai trouvé qu'il y avait une erreur listée dans la fenêtre de sortie:

c: ...\DynamicBuildFailTest\UnitTest1.cs (16,33,16,42): erreur CS0656: Le compilateur manquant est requis "Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create"

D'accord, VS2013 est meilleur pour signaler les erreurs, je vais chercher sur celles-ci:

 enter image description here

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

114
DLeh

Il y a une erreur du compilateur, Visual Studio 2015 ne signale pas l'erreur correctement. Cependant, Visual Studio 2013:

 

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

En bref:

Ajoutez une référence à Microsoft.CSharp afin d’utiliser dynamic comme ceci.

201
DLeh

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.

28
Nicholas Petersen

Il existe un problème connu avec des erreurs de construction n'apparaissant pas dans la liste des erreurs. Voir, par exemple, https://github.com/dotnet/roslyn/issues/4567 .

Pour contourner ce problème, dans la fenêtre "Liste des erreurs", sélectionnez le menu déroulant situé à droite de "Messages", puis sélectionnez "Construire + IntelliSense".

0
Neal Gafter

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

Le correctif consistait à abandonner complètement la dynamique et à utiliser plutôt JObject:

de

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

à

JObject locales = JObject.Parse(this.Locales);
0
Dan Ochiana

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

En passant, quand vous ouvrez la fenêtre Nuget, assurez-vous de ne pas rétrograder votre paquet (quand j'avais la version 2.0.11, cela m'a montré de passer à la version 2.0.9 qui est en train de déclasser ...)

0
silver