web-dev-qa-db-ja.com

vb.netのList.ForEach-私を困惑させる

次のコード例を検討してください。

    TempList.ForEach(Function(obj)
        obj.Deleted = True
    End Function)

そしてこれ:

    TempList.ForEach(Function(obj) obj.Deleted = True)

結果は同じになると思いますが、2番目のコード例では、リストTempListのオブジェクトは変更されません。

この投稿は、理由を理解するための詳細です...?または、少なくともその理由を理解するのに役立つ情報を入手してください...

25

これは、FunctionではなくSubを使用したためです。 Functionは値を返すため、コンパイラーは等号(=)が比較ではなく割り当てとして使用されていると見なします。 FunctionSubに変更すると、コンパイラーは等号を割り当てと正しく見なします。

TempList.ForEach(Sub(obj) obj.Deleted = True)

複数行のラムダがある場合、あなたはこの問題を持っていなかっただろう:

TempList.ForEach(Function(obj)
                     obj.Deleted = True
                     Return True
                 End Function)

明らかに、ForEachメソッドの場合、戻り値が使用されないため、Functionを使用しても意味がありません。したがって、Subを使用する必要があります。

53
Meta-Knight