Parece que ExpressionTrees compilador debe estar cerca de la C# spec en muchos comportamientos, pero a diferencia de C# no hay soporte para la conversión de decimal
a cualquier enum-type
:¿Este es un error ExpressionTrees? # 2
using System;
using System.Linq.Expressions;
class Program
{
static void Main()
{
Func<decimal, ConsoleColor> converter1 = x => (ConsoleColor) x;
ConsoleColor c1 = converter1(7m); // fine
Expression<Func<decimal, ConsoleColor>> expr = x => (ConsoleColor) x;
// System.InvalidOperationException was unhandled
// No coercion operator is defined between types
// 'System.Decimal' and 'System.ConsoleColor'.
Func<decimal, ConsoleColor> converter2 = expr.Compile();
ConsoleColor c2 = converter2(7m);
}
}
Otros rara vez se utiliza C# conversiones explícitas, como double -> enum-type
existe y funciona como se explica en la especificación C#, pero no en decimal -> enum-type
. ¿Es esto un error?
No sabía que los humanos sufrieron daños al crear el lenguaje C# :) –
"las conversiones decimales en realidad se implementan como conversiones definidas por el usuario en el tiempo de ejecución, pero el compilador las trata como conversiones incorporadas": ¿Qué significa esto? , y por qué se hizo de esta manera? – Brian
@Brian: cuando realiza una conversión de cambio de representación, digamos int a double, hay una instrucción IL que realiza exactamente esa conversión. Cuando haces decimal a double, en realidad generamos código para llamar a un método para hacer la conversión; no hay instrucciones de conversión integradas a CLR para decimales. Pero desde la perspectiva de * language * queremos que las conversiones decimales para * aparecer * sean conversiones incorporadas al lenguaje; tenemos diferentes reglas para las conversiones incorporadas y proporcionadas por el usuario. Así que tenemos que construir un escenario especial para ocultar lo que está sucediendo detrás de las escenas con decimales. –