La compilación VS2015 falla sin mensaje de error con Dynamic

136

Estaba escribiendo una prueba unitaria en un fragmento de código que devolvió JSON. El tipo que devuelve es un tipo anónimo, por lo que pensé en verificar los valores en él, simplemente había enviado el objeto a dynamicpara hacer mis afirmaciones.

Sin embargo, cuando hago eso, mi compilación falla pero no tengo ningún mensaje de error. Pude reproducir esto con un código muy simple en un nuevo Proyecto de Prueba de Unidad:

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

    dynamic asDynamic = obj;

    Assert.IsTrue(asDynamic.someValue);
}

Vea a continuación una captura de pantalla de la falla de compilación

falla de construcción

Sin embargo, la compilación tiene éxito cuando comento la afirmación:

construir con éxito sin afirmar

Por el contrario, ejecuté el siguiente código en LinqPad 5 beta (que usa el compilador Roslyn) y no tuve problemas:

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

Cierto

¿Que está pasando aqui? Dado que el error no se muestra, no puedo decir si estoy usando dynamicincorrectamente, o si no puede encontrar la sobrecarga para usar IsTrue()debido a esto dynamic, o si esto es un error en el compilador (aunque dudo mucho que esto , No tengo ninguna evidencia de que haya algo mal con mi código).

Con respecto al problema de sobrecarga, lo intenté Assert.IsTrue((bool)asDynamic.someValue);pero la compilación aún falla, todavía no hay mensaje de error.

Según el comentario de @ RonBeyer, también probé más casting como el siguiente, pero fue en vano:

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

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

Tras una inspección más cercana, descubrí que había un error en la lista de la ventana Salida:

c: ... \ DynamicBuildFailTest \ UnitTest1.cs (16,33,16,42): error CS0656: Falta compilador miembro requerido 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

De acuerdo, VS2013 es mejor para informar los errores, buscaré en función de eso:

ingrese la descripción de la imagen aquí

De acuerdo, agregar una referencia a Microsoft.CSharp solucionó el error de compilación , pero dejaré esta pregunta abierta porque presumiblemente es un problema con VS2015 que (en mi opinión) debería resolverse.

DLeh
fuente
¿Estás seguro de que en realidad es un error de compilación en lugar de un error de enlace?
David W
Se puede tratar dynamic asDynamic = (dynamic)obj;? O simplemente en la Afirmación, comente la dinámica y escriba Assert.IsTrue(((dynamic)obj).someValue);.
Ron Beyer
@RonBeyer sí, también había probado ambos, no suerte.
DLeh
¿Una más ... Assert.IsTrue((bool)asDynamic.someValue);?
Ron Beyer
1
Enfrenté el mismo problema en VS2015 al intentar usar la dinámica en los métodos de prueba. La compilación falló sin ningún error. Y después de agregar la referencia Microsoft.CSharp, la compilación se realizó correctamente.
Sarath Rachuri

Respuestas:

226

Hay un error del compilador, Visual Studio 2015 simplemente no informa el error correctamente. Sin embargo, Visual Studio 2013 hace:

Esto se responde aquí: https://stackoverflow.com/a/13568247 :

En breve:

Agregue una referencia a Microsoft.CSharp para usar dynamicasí.

DLeh
fuente
9
Agregue la referencia a Microsoft.CSharpdll aunque using Microsoft.CSharp;no arroje un error de tiempo de compilación.
Barry Guvenkaya
45
Con .NET Core agregue el paquete NuGet en su Microsoft.CSharplugar.
Bart Verkoeijen
66
Lo mismo para la biblioteca de clases basada en .Net Standard: agregue el paquete NuGet Microsoft.CSharp.
Hong
50

Como dos personas han señalado en los comentarios, para Net Core y NetStandard, este problema a veces se soluciona agregando una referencia a NuGet Microsoft.CSharp.

Nicholas Petersen
fuente
3
Esto resolvió mi problema después de convertir un proyecto a .NET Standard, ¡gracias!
Joakim Skoog
1
Lo mismo ocurre con un script SSIS que agrega una hoja de Excel.
SteveCav
@JoakimSkoog ... Tuve este problema en un proyecto .NET Standard (nunca convertido) y aún así tuve que agregar una referencia manualmente.
ebol2000
1

Tuve este problema al usar palabras clave dinámicas en combinación con Newtonsoft.json en un proyecto .net 3.0.

La solución fue eliminar la dinámica por completo y utilizar JObject en su lugar:

de

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

a

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

Existe un problema conocido con los errores de compilación que no aparecen en la lista de errores. Ver, por ejemplo, https://github.com/dotnet/roslyn/issues/4567 .

Para solucionarlo, en la ventana "Lista de errores", seleccione el menú desplegable a la derecha de "Mensajes" y seleccione "Build + IntelliSense".

Neal Gafter
fuente
0

Tuve un problema similar y lo único que me resolvió fue actualizar mi paquete NUnit a la última versión.

Por cierto, cuando abres la ventana de Nuget, asegúrate de no estar degradando tu paquete (cuando tenía la versión 2.0.11 me mostró que debía actualizar a la versión 2.0.9, que en realidad está degradando ...)

plata
fuente