La compilazione VS2015 non riesce senza alcun messaggio di errore con Dynamic


136

Stavo scrivendo un test unitario su un pezzo di codice che restituiva JSON. Il tipo che restituisce è un tipo anonimo, quindi ho pensato di verificare i valori su di esso, avrei semplicemente lanciato l'oggetto su un dynamicper fare le mie affermazioni.

Tuttavia, quando lo faccio, la mia compilazione fallisce ma non ho alcun messaggio di errore. Sono stato in grado di riprodurre questo con un codice molto semplice in un nuovo progetto di unit test:

[TestMethod]
public void TestMethod1()
{
    var obj = new { someValue = true };

    dynamic asDynamic = obj;

    Assert.IsTrue(asDynamic.someValue);
}

Vedi sotto per uno screenshot della build fallita

compilazione non riuscita

La compilazione ha esito positivo quando commento un'asserzione:

costruire successo senza affermare

Al contrario, ho eseguito il seguente codice in LinqPad 5 beta (che utilizza il compilatore Roslyn) e non ho avuto problemi:

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

Vero

Cosa sta succedendo qui? Dal momento che l'errore non viene visualizzato, non posso dire se sto usando in dynamicmodo errato, o se non riesco a trovare il sovraccarico da utilizzare a IsTrue()causa del dynamic, o se questo è un bug nel compilatore (anche se ne dubito fortemente , Non ho alcuna prova che ci sia qualcosa di sbagliato nel mio codice).

Per quanto riguarda il problema di sovraccarico, ho provato Assert.IsTrue((bool)asDynamic.someValue);ma la build non riesce ancora, ancora nessun messaggio di errore.

Per il commento di @ RonBeyer, avevo anche provato più casting come di seguito senza alcun risultato:

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

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

A un esame più attento, ho scoperto che c'era un errore elencato nella finestra Output:

c: ... \ DynamicBuildFailTest \ UnitTest1.cs (16,33,16,42): errore CS0656: membro del compilatore mancante richiesto 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

Va bene, VS2013 è migliore nel segnalare gli errori, cercherò in base a quelli:

inserisci qui la descrizione dell'immagine

Va bene, l' aggiunta di un riferimento a Microsoft.CSharp ha risolto l'errore di compilazione , ma lascerò aperta questa domanda perché presumibilmente è un problema con VS2015 che (nella mia mente) dovrebbe essere risolto.


Sei sicuro che sia in realtà un errore di compilazione piuttosto che un errore di collegamento?
David W,

Puoi provare dynamic asDynamic = (dynamic)obj;? O semplicemente nell'Asserzione, commenta la dinamica e scrivi Assert.IsTrue(((dynamic)obj).someValue);.
Ron Beyer,

@RonBeyer sì, avevo provato anche entrambi, non fortuna.
DLeh,

Ancora uno ... Assert.IsTrue((bool)asDynamic.someValue);?
Ron Beyer,

1
Ho riscontrato lo stesso problema in VS2015 mentre cercavo di usare la dinamica nei metodi di prova. La compilazione non è riuscita senza errori. E dopo aver aggiunto il riferimento Microsoft.CSharp la compilazione è riuscita.
Sarath Rachuri,

Risposte:


226

Si è verificato un errore del compilatore, Visual Studio 2015 non segnala l'errore correttamente. Tuttavia, Visual Studio 2013 fa:

Questa è la risposta qui: https://stackoverflow.com/a/13568247 :

In breve:

Aggiungi un riferimento a Microsoft.CSharp per usarlo in dynamicquesto modo.


9
Aggiungi il riferimento a Microsoft.CSharpdll anche se using Microsoft.CSharp;non genera un errore di tempo di compilazione.
Barry Guvenkaya,

45
Con .NET Core aggiungi Microsoft.CSharpinvece il pacchetto NuGet .
Bart Verkoeijen il

6
Lo stesso per la libreria di classi basata su .Net Standard - aggiungi il pacchetto NuGet Microsoft.CSharp.
Hong

50

Come hanno notato due persone nei commenti, per Net Core e NetStandard, questo problema è talvolta risolto aggiungendo un riferimento NuGet a Microsoft.CSharp.


3
Questo ha risolto il mio problema dopo aver convertito un progetto in .NET Standard, grazie!
Joakim Skoog,

1
Idem con uno script SSIS che aggiunge un foglio Excel.
SteveCav il

@JoakimSkoog ... Ho avuto questo problema su un progetto .NET Standard (mai convertito) e dovevo ancora aggiungere un riferimento manualmente.
ebol2000,

1

Ha riscontrato questo problema utilizzando la parola chiave dinamica in combinazione con Newtonsoft.json in un progetto .net 3.0.

La soluzione era eliminare completamente la dinamica e utilizzare invece JObject:

a partire dal

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

per

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

0

Esiste un problema noto con errori di compilazione che non compaiono nell'elenco degli errori. Vedi, ad esempio, https://github.com/dotnet/roslyn/issues/4567 .

Per aggirare il problema, nella finestra "Elenco errori", seleziona il menu a discesa a destra di "Messaggi" e seleziona "Build + IntelliSense".


0

Ho avuto un problema simile e l'unica cosa che mi ha risolto è stato aggiornare il mio pacchetto NUnit all'ultima versione.

A proposito, quando apri la finestra di Nuget assicurati di non eseguire il downgrade del tuo pacchetto (quando ho avuto la versione 2.0.11 mi ha mostrato di aggiornare alla versione 2.0.9 che in realtà sta eseguendo il downgrade ...)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.