2017-08-31 5 views
0
次のコードで

なぜTask.Run引数で使用される外部変数が割り当てられていないと考えられますか?

async Task<int> Foo() 
{ 
    int result; 
    await Task.Run(() => { result = 9999; }); 
    return result; 
} 

VS 2015は、エラーを報告: "未割り当てのローカル変数 '結果' の使用"。だから、変更を加えましょう:

async Task<int> Foo() 
{ 
    int result = 0; 
    await Task.Run(() => { result = 9999;}); 
    return result; 
} 

そしてvoila。コンパイルするだけでなく、期待通りに9999を返します。

ステートメントで明らかに割り当てられている場合、最初の例でresultが割り当て解除されていると見なされるのはなぜですか?

答えて

4

コンパイラは、内部がTask.Runであることを知らないため、ラムダ() => result = 999が実行されるかどうかを知るほどスマートではありません。

ラムダが実行されるかどうかわからないので、resultreturn式の前に値が割り当てられていることを保証する必要があります。

関連する問題