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


Estaba escribiendo una prueba unitaria en un fragmento de código que devolvía JSON. El tipo que devuelve es un tipo anónimo, así que pensé que para verificar los valores en él simplemente enviaría el objeto a un dynamic para hacer mis aserciones.

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 del fallo de compilación

fallo de construcción

El construir tiene éxito cuando comento la afirmación aunque:

construir con éxito sin afirmar

En contraste, 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());

Verdadero

¿Qué está pasando aquí? 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 dynamic, o si esto es un error en el compilador (aunque lo dudo mucho, no lo hago tener alguna evidencia de que hay algo mal con mi código).

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

Según el comentario de @ RonBeyer, también había intentado más casting como el siguiente sin éxito:

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

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

Tras una inspección más cercana, encontré que había un error listado en la ventana de salida:

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

Está bien, VS2013 es mejor en reportar los errores, buscaré en base a esos:

introduzca la descripción de la imagen aquí

Bien, añadiendo una referencia a Microsoft.CSharp corrigió el error de compilación , pero dejaré esta pregunta abierta porque es presumiblemente un problema con VS2015 que (en mi mente) debería resolverse.

Author: Community, 2015-08-12

5 answers

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 resumen:

Agregue una referencia a Microsoft.CSharp para usar dynamic así.

 179
Author: DLeh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:35

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.

 20
Author: Nicholas Petersen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-16 01:23:24

Existe un problema conocido con errores de compilación que no aparecen en la lista de errores. Véase, 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".

 0
Author: Neal Gafter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-26 04:24:23

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

Por cierto, cuando se abre la ventana de Nuget asegúrese de que su no downgrading su paquete (cuando tenía la versión 2.0.11 me mostró para actualizar a la versión 2.0.9 que es en realidad downgrading...)

 0
Author: silver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-31 08:21:23

Tuvo este problema usando la palabra clave dinámica en combinación con Newtonsoft.json en un proyecto. net 3.0.

La solución fue eliminar dynamic por completo y usar JObject en su lugar:

De

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

A

JObject locales = JObject.Parse(this.Locales);
 0
Author: Dan Ochiana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-04 11:59:26