は、多くの行動のC#の仕様に近くなければなりませんExpressionTreesコンパイラのように見えますが、C#のとは異なり、任意のenum-type
へdecimal
からの変換はサポートされていません。これは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);
}
}
その他ほとんど使われないC#の明示的な変換、double -> enum-type
が好きで存在し、C#の仕様で説明されているように動作しますが、decimal -> enum-type
では動作しません。これはバグですか?
私は人間がC#言語の作成に傷ついたことは知らなかった:) –
"十進数変換は実際にはランタイムではユーザー定義の変換として実装されているが、コンパイラによる組み込み変換として扱われる"なぜこのようにしたのですか? – Brian
@Brian:表記を変える変換、つまりintをdoubleにすると、まさにその変換を行うIL命令があります。十進数を2倍にすると、実際に変換を行うメソッドを呼び出すコードが生成されます。小数点のための組み込みCLR変換命令はありません。しかし、*言語*の観点からは、10進変換が*組み込みの言語変換であるように見えます。ビルトインとユーザー提供のコンバージョンのルールが異なります。だから、シーンの裏に何が起こっているのかを小数点で隠すために、特別な景色を構築しなければなりません。 –