10

のようなラムダがある場合() => { throw new Exception(); }、それがリターンタイプであるかどうかは不明です。Actionこのため、(暗黙的に)とFunc<object>(またはその他)の両方に変換できますFunc<T>。これは、§6.5C #4仕様の無名関数変換によると次の理由によるものです。

[A]デリゲート型は、提供さDれる無名関数と互換性があります。F

  • …</p>

  • がreturn型で、の本体がDステートメントブロックの場合、[…]の本体が有効なステートメントブロックであり、returnステートメントが式を指定していません。voidFF

  • D非voidの戻り型を持ち、の本体がFステートメントブロックである場合、[…]の本体がF到達不能なエンドポイントを持つ有効なステートメントブロックであり、各returnステートメントが暗黙的に戻り値に変換可能な式を指定します。のタイプD

しかし、メソッドのオーバーロードが2つあり、一方がタイプのパラメーターを持ちAction、もう一方Func<object>が上からラムダを渡す場合、Func<object>オーバーロードが使用されます。なんで?仕様のどの部分がこの場合Func<object>よりも優れていると言っていますか?Action

私は§7.5.3.2より良い関数メンバーを見てきましたが、それはそれを説明していません。

4

1 に答える 1

11

私は1つのセクションを下に見るべきでした:§7.5.3.3式からのより良い変換はそれを説明します:

式から型に変換する暗黙の変換、および式から型に変換する暗黙の変換を考えると、次の少なくとも1つが当てはまる場合よりも優れた変換です。C1ET1C2ET2C1C2

  • …</p>

  • Eは無名関数であり、デリゲート型または式ツリー型のいずれかであり、デリゲート型または式ツリー型のいずれかであり、次のいずれかが当てはまります。T1D1Expression<D1>T2D2Expression<D2>

    • …</p>

    • D1と同一のパラメータリストがあり、次のいずれかが当てはまります。D2

      • …</p>

      • D1戻り型があり、戻り値Yが無効ですD2

于 2012-08-13T20:27:03.670 に答える