VS2015 Build schlägt ohne Fehlermeldung mit Dynamic fehl

136

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

Build fehlgeschlagen

Der Build ist erfolgreich, wenn ich die Behauptung auskommentiere:

Build erfolgreich ohne zu behaupten

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 dynamicfalsch verwende oder ob die Überlastung IsTrue()aufgrund des Fehlers nicht gefunden werden kann dynamicoder 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:

Geben Sie hier die Bildbeschreibung ein

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.

DLeh
quelle
Sind Sie sicher, dass es sich tatsächlich eher um einen Kompilierungsfehler als um einen Verbindungsfehler handelt?
David W
Kannst du es versuchen dynamic asDynamic = (dynamic)obj;? Oder kommentieren Sie einfach in der Assertion die Dynamik aus und schreiben Sie Assert.IsTrue(((dynamic)obj).someValue);.
Ron Beyer
@ RonBeyer ja ich hatte auch beide ausprobiert, kein Glück.
DLeh
Noch eine ... Assert.IsTrue((bool)asDynamic.someValue);?
Ron Beyer
1
Ich hatte das gleiche Problem in VS2015, als ich versuchte, Dynamic in Testmethoden zu verwenden. Der Build ist fehlerfrei fehlgeschlagen. Nach dem Hinzufügen der Microsoft.CSharp-Referenz war der Build erfolgreich.
Sarath Rachuri

Antworten:

226

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:

Fügen Sie einen Verweis auf Microsoft.CSharp hinzu, um dies zu verwenden dynamic.

DLeh
quelle
9
Fügen Sie den Verweis auf Microsoft.CSharpdll hinzu, obwohl using Microsoft.CSharp;kein Fehler bei der Kompilierung auftritt.
Barry Guvenkaya
45
Fügen Sie mit .NET CoreMicrosoft.CSharp stattdessen das NuGet-Paket hinzu .
Bart Verkoeijen
6
Gleiches gilt für die auf .Net Standard basierende Klassenbibliothek. Fügen Sie das NuGet-Paket Microsoft.CSharp hinzu.
Hong
49

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.

Nicholas Petersen
quelle
3
Dies löste mein Problem nach der Konvertierung eines Projekts in .NET Standard, danke!
Joakim Skoog
1
Das Gleiche gilt für ein SSIS-Skript, das eine Excel-Tabelle hinzufügt.
SteveCav
@JoakimSkoog ... Ich hatte dieses Problem in einem .NET Standard-Projekt (nie konvertiert) und musste trotzdem manuell eine Referenz hinzufügen.
ebol2000
1

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

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

zu

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

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".

Neal Gafter
quelle
0

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 ...)

Silber
quelle