Las enumeraciones en las expresiones lambda se compilan de manera diferente; ¿consecuencia de mejoras en la resolución de sobrecarga?


Mientras probaba Visual Studio 2015 RC, recibí un error de tiempo de ejecución en el código que funcionaba anteriormente. Dada la lambda (x => x.CustomerStatusID == CustomerStatuses.Active) que se pasó a una función como Expression<>, el depurador muestra una diferencia en el árbol de expresiones. Anteriormente compilaba como esto:

.Lambda #Lambda1<System.Func`2[Services.DataClasses.CustomerDC,System.Boolean]>(Services.DataClasses.CustomerDC $x)
{
    (System.Int32)$x.CustomerStatusID == 0
}

Pero en C # 6.0 ahora se compila como

.Lambda #Lambda1<System.Func`2[Services.DataClasses.CustomerDC,System.Boolean]>(Services.DataClasses.CustomerDC $x)
{
    (System.Int32)$x.CustomerStatusID == (System.Int32).Constant<Services.DataClasses.CustomerStatuses>(Active)
}

Aunque la solución a mi código que atraviesa el árbol fue sencilla y el detalle adicional es apreciado, ¿alguien sabe de otras trampas flotando alrededor ¿así?

Alternativamente, ¿alguien tiene un enlace a la información sobre los detalles de cómo se mejoró la resolución de sobrecarga? No encuentro ninguno.

Author: Teun D, 2015-05-29

1 answers

Esto no tiene nada que ver con la resolución de sobrecarga. El compilador anterior optimizó prematuramente el lado derecho de la comparación, omitiendo así el código correspondiente a la expresión fuente.

 4
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-06-23 00:23:38