J'écrivais un test unitaire sur un morceau de code qui retournait JSON. Le type qu'il renvoie est un type anonyme, j'ai donc pensé que pour vérifier les valeurs dessus, je viens de convertir l'objet en a dynamic
pour faire mes assertions.
Cependant, lorsque 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 l'échec de la construction
La construction réussit quand je commente l'assertion:
En revanche, j'ai exécuté le code suivant dans LinqPad 5 beta (qui utilise le compilateur Roslyn) et je n'ai eu aucun problème:
var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
Vrai
Que se passe t-il ici? Étant donné que l'erreur ne s'affiche pas, je ne peux pas dire si j'utilise de dynamic
manière incorrecte, ou s'il ne trouve pas la surcharge à utiliser à IsTrue()
cause de dynamic
, ou s'il s'agit d'un bogue dans le compilateur (bien que je doute fortement de cela , Je n'ai aucune preuve qu'il y a un problème 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 é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 y regardant de plus près, j'ai trouvé une erreur répertoriée dans la fenêtre Sortie:
c: ... \ DynamicBuildFailTest \ UnitTest1.cs (16,33,16,42): erreur CS0656: membre requis du compilateur manquant 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
D'accord, VS2013 est meilleur pour signaler les erreurs, je vais chercher en me basant sur celles-ci:
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 c'est probablement un problème avec VS2015 qui (dans mon esprit) devrait être résolu.
dynamic asDynamic = (dynamic)obj;
? Ou juste dans l'assertion, commentez la dynamique et écrivezAssert.IsTrue(((dynamic)obj).someValue);
.Assert.IsTrue((bool)asDynamic.someValue);
?Réponses:
Il y a une erreur du compilateur, Visual Studio 2015 ne signale tout simplement pas l'erreur correctement. Cependant, Visual Studio 2013 fait:
Ceci est répondu ici: https://stackoverflow.com/a/13568247 :
En bref:
la source
Microsoft.CSharp
dll même si elleusing Microsoft.CSharp;
ne lève pas d'erreur de compilation.Microsoft.CSharp
.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
.la source
Eu ce problème en utilisant le mot-clé dynamique en combinaison avec Newtonsoft.json dans un projet .net 3.0.
Le correctif était de supprimer complètement la dynamique et d'utiliser JObject à la place:
de
à
la source
Il existe 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 contourner ce problème, dans la fenêtre "Liste des erreurs", sélectionnez le menu déroulant à droite de "Messages" et sélectionnez "Construire + IntelliSense".
la source
J'ai eu un problème similaire et la seule chose qui me l'a résolu a été de mettre à niveau mon package NUnit vers la dernière version.
Au fait, lorsque vous ouvrez la fenêtre Nuget, assurez-vous que vous ne rétrogradez pas votre paquet (quand j'avais la version 2.0.11, cela m'a montré de passer à la version 2.0.9 qui est en fait une rétrogradation ...)
la source