Wygląda ExpressionTrees kompilator powinien być blisko z C# specyfikacji w wielu zachowań, ale w przeciwieństwie do C# nie ma wsparcia dla konwersji z decimal
do dowolnego enum-type
:Czy to jest błąd 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);
}
}
Inne rzadko używane C# jawne konwersje, jak double -> enum-type
istnieje i działa tak, jak wyjaśniono w specyfikacji C#, ale nie pod numerem decimal -> enum-type
. Czy to błąd?
Nie wiedziałem, że ludzie zostali skrzywdzeni podczas tworzenia języka C# :) –
"Konwersje dziesiętne są faktycznie realizowane jako konwersje zdefiniowane przez użytkownika w środowisku wykonawczym, ale są traktowane jako wbudowane konwersje przez kompilator": Co to oznacza? i dlaczego zostało to zrobione w ten sposób? – Brian
@Brian: Kiedy wykonujesz konwersję zmieniającą reprezentację, powiedz int, aby podwoić, istnieje instrukcja IL, która wykonuje dokładnie tę konwersję. Kiedy robisz dziesiętny, aby podwoić, generujemy kod, aby wywołać metodę konwersji; nie ma instrukcji konwersji w formacie dziesiętnym do CLR. Ale z perspektywy * języka * chcemy, aby konwersje dziesiętne * wyświetlały * jako konwersje w języku innym niż język; mamy różne reguły dla wbudowanych i dostarczanych przez użytkowników konwersji. Musimy więc zbudować specjalną scenografię, aby ukryć to, co dzieje się za kulisami z miejscami dziesiętnymi. –