web-dev-qa-db-ja.com

ラムダ式の列挙型は異なる方法でコンパイルされます。過負荷解像度の改善の結果?

Visual Studio 2015 RCを試しているときに、以前に機能していたコードで実行時エラーが発生しました。 (x => x.CustomerStatusID == CustomerStatuses.Active)として関数に渡されたラムダExpression<>が与えられると、デバッガーは式ツリーに違いを示します。以前は次のようにコンパイルされていました。

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

しかし、C#6.0では、次のようにコンパイルされます。

.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)
}

私のツリートラバースコードの修正は簡単で、追加の詳細は高く評価されていますが、このように浮かんでいる他の落とし穴を知っている人はいますか?

あるいは、過負荷の解決がどのように改善されたかの詳細に関する情報へのリンクを誰かが持っていますか?何も見つかりません。

68
Ron Newcomb

これは過負荷の解決とは何の関係もありません。以前のコンパイラは、比較の右側を時期尚早に最適化したため、ソース式に対応するコードが省略されていました。

4
Neal Gafter