Ich habe einen Komponententest für einen Code geschrieben, der JSON zurückgegeben hat. Der Typ, den es zurückgibt, ist ein anonymer Typ, daher dachte ich, um die Werte darauf zu überprüfen, würde ich das Objekt einfach in a umwandeln dynamic
, um meine Aussagen zu machen.
Wenn ich das mache, schlägt mein Build jedoch fehl, aber ich habe keine Fehlermeldungen. Ich konnte dies mit sehr einfachem Code in einem neuen Unit-Test-Projekt reproduzieren:
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
Unten finden Sie einen Screenshot des fehlgeschlagenen Builds
Der Build ist erfolgreich, wenn ich die Behauptung auskommentiere:
Im Gegensatz dazu habe ich den folgenden Code in LinqPad 5 Beta (das den Roslyn-Compiler verwendet) ausgeführt und hatte keine Probleme:
var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
Wahr
Was ist denn hier los? Da der Fehler nicht angezeigt wird, kann ich nicht feststellen, ob ich ihn dynamic
falsch verwende oder ob die Überlastung IsTrue()
aufgrund des Fehlers nicht gefunden werden kann dynamic
oder ob dies ein Fehler im Compiler ist (obwohl ich dies sehr bezweifle Ich habe keine Beweise dafür, dass etwas mit meinem Code nicht stimmt.
In Bezug auf das Überlastungsproblem habe ich versucht, Assert.IsTrue((bool)asDynamic.someValue);
aber der Build schlägt immer noch fehl, immer noch keine Fehlermeldung.
Per @ RonBeyers Kommentar hatte ich auch mehr Casting wie das folgende versucht, ohne Erfolg:
dynamic asDynamic = (dynamic)obj;
Assert.IsTrue(((dynamic)asDynamic).someValue);
Assert.IsTrue((bool)asDynamic.somevalue);
Bei näherer Betrachtung stellte ich fest, dass im Ausgabefenster ein Fehler aufgeführt war:
c: ... \ DynamicBuildFailTest \ UnitTest1.cs (16,33,16,42): Fehler CS0656: Fehlender Compiler erforderlich Mitglied 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
Okay, VS2013 kann die Fehler besser melden. Ich werde danach suchen:
Okay, das Hinzufügen eines Verweises auf Microsoft.CSharp hat den Erstellungsfehler behoben , aber ich werde diese Frage offen lassen, da es sich vermutlich um ein Problem mit VS2015 handelt, das (meiner Meinung nach) behoben werden sollte.
quelle
dynamic asDynamic = (dynamic)obj;
? Oder kommentieren Sie einfach in der Assertion die Dynamik aus und schreiben SieAssert.IsTrue(((dynamic)obj).someValue);
.Assert.IsTrue((bool)asDynamic.someValue);
?Antworten:
Es liegt ein Compilerfehler vor. Visual Studio 2015 meldet den Fehler einfach nicht richtig. Visual Studio 2013 bietet jedoch Folgendes:
Dies wird hier beantwortet: https://stackoverflow.com/a/13568247 :
Zusamenfassend:
quelle
Microsoft.CSharp
dll hinzu, obwohlusing Microsoft.CSharp;
kein Fehler bei der Kompilierung auftritt.Microsoft.CSharp
stattdessen das NuGet-Paket hinzu .Wie zwei Personen in Kommentaren für Net Core und NetStandard festgestellt haben, wird dieses Problem manchmal durch Hinzufügen eines NuGet-Verweises auf behoben
Microsoft.CSharp
.quelle
Hatte dieses Problem bei der Verwendung eines dynamischen Schlüsselworts in Kombination mit Newtonsoft.json in einem .net 3.0-Projekt.
Das Update bestand darin, die Dynamik vollständig zu löschen und stattdessen JObject zu verwenden:
von
zu
quelle
Es ist ein Problem bekannt, bei dem Buildfehler nicht in der Fehlerliste angezeigt werden. Siehe zum Beispiel https://github.com/dotnet/roslyn/issues/4567 .
Um dies zu umgehen, wählen Sie im Fenster "Fehlerliste" das Pulldown-Menü rechts neben "Nachrichten" und dann "Build + IntelliSense".
quelle
Ich hatte ein ähnliches Problem und das einzige, was es für mich löste, war das Upgrade meines NUnit-Pakets auf die neueste Version.
Übrigens, wenn Sie das Nuget-Fenster öffnen, stellen Sie sicher, dass Sie Ihr Paket nicht herunterstufen (als ich Version 2.0.11 hatte, zeigte es mir, dass ich auf Version 2.0.9 upgraden musste, die tatsächlich heruntergestuft wird ...)
quelle