特定のプロパティの私のプロジェクトでは、フォーム (x=>x.property) の式は、次のように実行時に (x=>Convert(x.property)) として出力されます。
プロパティのタイプによって異なりますが、double と DateTime が原因のようです。文字列プロパティに対しては正常に機能します (たとえば、Speed と ForeColour は両方とも文字列です)。
なんでこんなに出てくるの?
特定のプロパティの私のプロジェクトでは、フォーム (x=>x.property) の式は、次のように実行時に (x=>Convert(x.property)) として出力されます。
プロパティのタイプによって異なりますが、double と DateTime が原因のようです。文字列プロパティに対しては正常に機能します (たとえば、Speed と ForeColour は両方とも文字列です)。
なんでこんなに出てくるの?
double
およびDateTime
は値型です。コンパイラはExpression.Convert
、基本的にボックス化操作を表すために使用しています。
string
はすでに参照型であるため、変換は必要ありません。
通常のコードでも同じことがわかります。
double d = 0.5;
string s = "hello";
object o1 = d;
object o2 = s;
... にコンパイルされます。
// d = 0.5
IL_0001: ldc.r8 0.5
IL_000a: stloc.0
// s = "hello"
IL_000b: ldstr "hello"
IL_0010: stloc.1
// o1 = d - boxing!
IL_0011: ldloc.0
IL_0012: box [mscorlib]System.Double
IL_0017: stloc.2
// o2 = s - no boxing required!
IL_0018: ldloc.1
IL_0019: stloc.3