6

次のコード スニペットを検討してください。

Func<int, bool> TestGreaterThanOne = delegate(int a) {
                 if (a > 1) return (true);
                 else return(false);
                 };

上記のコードでは、"else return(false)" ステートメントを削除できません。コンパイラは、すべてのコード パスが値を返すわけではないことを警告します。しかし、ラムダを使用する次のコードでは...

Func<int, bool> TestGreaterThanOne = a => a > 1;

「else」ステートメントを使用する必要はありません。コンパイラの警告はなく、ロジックは期待どおりに機能します。

ラムダに「else」ステートメントを持たないようにするために、ここでどのようなメカニズムが働いていますか?

4

5 に答える 5

21

ラムダの省略形には、 if ステートメントもありません。ラムダの省略形は次と同等です

Func<int, bool> TestGreaterThanOne = delegate(int a) { 
             return (a > 1);
             }; 

したがって、すべてのコード パスは値を返します。

于 2012-07-11T15:47:31.897 に答える
2

他の応答にわずかに追加するには、ラムダステートメントでa > 1ブール値に評価され、ブール値が返されます。

一般的に、書き込みreturn true;return false;ステートメントは冗長であると見なされます。式が評価するものは何でも返す方が簡単です。

于 2012-07-11T15:50:04.550 に答える
1

デリゲートを書き換える代わりに、ラムダ抽象化は次と同等です

Func<int, bool> TestGreaterThanOne = a => {
             if (a > 1) return (true);
             else return(false);
             };

else ブランチも削除できません。それも返ってこないからです。現在のバージョンa > 1は、ブール値 (常に存在する) であるため機能します。

于 2012-07-11T15:53:58.180 に答える
0

あなたが言及した場合、彼らがブール値を異なる方法で処理しているとは思いません。コードは 2 つの異なることを行っているだけです。Funcasを定義するFunc<int, bool>ため、ブール値の戻り値が必要です。2 番目のコードは常にブール値を返します。ただし、コードの最初の部分は、else を含めない限りブール値を返しません。

于 2012-07-11T15:50:29.740 に答える
0

a>1それ自体がブール値であるため、ラムダが機能します。if ステートメントは、ブール値のパラメーターを受け取る関数と考えることができるので、次のようなことができます。

boolean b = true

if(b)
    doSomething();

そしてそれはコンパイルされ、doSomething を実行します

于 2012-07-11T15:51:25.420 に答える