2

これが機能する理由について私は混乱しています:

Action myAction1 = () => myIntFunc(); 
...
private Int32 myIntFunc() {
    return(4);
    }

アクションはパラメーターを返さない関数を表すため、コンパイラーはこれを許可しないと思いますが、myIntFuncは明らかにパラメーターを返します。

さらなる証拠として、これは機能しないことに注意してください。

Action myAction2 = myIntFunc;

つまり、ラムダ構文を使用すると、回避できないはずの何かを回避できるようになります。アクションとラムダがどのように連携するかと関係があるのを見落としていると思います...??

4

3 に答える 3

2

私はあなたがこれをするときと同じだと思います:

myIntFunc();

メソッドの結果を無視します。

于 2012-08-14T18:01:19.670 に答える
1

あなたがやろうとしていることは明示的に許可されています。デリゲートに関するMSDNドキュメントによるとAction(強調が追加されました):

カプセル化されたメソッドには、パラメーターや戻り値があってはなりません。(C#では、メソッドはvoidを返す必要があります。[…]無視される値を返すメソッドにすることもできます。

于 2012-08-14T18:08:43.333 に答える
0

C#言語仕様の6.5項で、箇条書きの1つに次のように記載されています。Dにvoid戻り型があり、Fの本体が式である場合、Fの各パラメーターにDの対応するパラメーターの型が指定されると、 Fは、ステートメント式(§8.6)として許可される有効な式(wrt§7)です。

したがって、その場合は戻り値を破棄しても問題ありません。

メソッドグループの変換については、代わりに6.6項を参照してください。次に、メソッドは戻り型を含めて互換性がなければなりません。

したがって、匿名メソッド(ラムダ)と通常の(名前付き)メソッド(またはメソッドグループ)には違いがあります。

于 2012-08-14T18:21:46.937 に答える