c# - iver - La compilación VS2015 falla sin mensaje de error con Dynamic
roslyn c# (5)
Estaba escribiendo una prueba unitaria en un 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 convertiría el objeto en una
dynamic
para 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
Sin embargo, la compilación tiene éxito cuando comento la afirmación:
Por el contrario, ejecuté el siguiente código en LinqPad 5 beta (que usa el compilador de 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
dynamic
incorrectamente, o si no puede encontrar la sobrecarga para usar para
IsTrue()
debido a la
dynamic
, o si esto es un error en el compilador ( Aunque lo dudo mucho, no tengo ninguna evidencia de que haya algo mal con mi código).
Con respecto al problema de sobrecarga, probé
Assert.IsTrue((bool)asDynamic.someValue);
pero la construcción aún falla, aún no hay mensaje de error.
Según el comentario de @ RonBeyer, también intenté 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 ventana de 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:
De acuerdo, agregar una referencia a Microsoft.CSharp corrigió 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.
Como dos personas han señalado en los comentarios, para Net Core y NetStandard, este problema a veces se soluciona agregando una referencia NuGet a
Microsoft.CSharp
.
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".
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);
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 ...)