2017-04-27 4 views
1

.NETコアのControllerではOk()IActionResultとして返すことができます。しかし、私はそれがまたTask<IActionResult>を返す方法を理解していません。Ok()はどのようにして<IActionResult>タスクとIActionResultの両方になりますか?

例:

public class FooController : Controller 
    { 

     [HttpGet] 
     public async Task<IActionResult> OkResultAsync() 
     { 
      // This is ok. But I don't get why since OkResult != Task<IActionResult> 
      OkResult result = Ok(); 
      return result; 
     } 

     [HttpGet] 
     public IActionResult OkResult() 
     { 
      // This is ok, and it seems logical since OkResult implements IActionResult. 
      OkResult result = Ok(); 
      return result; 
     } 

     [HttpGet] 
     public FooResult Bar() 
     { 
      // This is ok. 
      return new FooResult(); 
     } 

     [HttpGet] 
     public async Task<FooResult> BarAsync() 
     { 
      // This is not ok since FooResult != Task<FooResult> 
      return new FooResult(); 
     } 
    } 

Ok()が順番にIActionResultを実装OkResultを返します。メソッドシグネチャがTask<IActionResult>を返す場合、.NETはそれを処理する方法を(待機せずに)どのように知っていますか?

+2

'async-await'はコンパイラー機能で、非同期実行用のコードを生成します。したがって、メソッドを 'async'としてマークすると、コンパイラは戻り値を' Task ' – Fabio

答えて

4

キーワードasyncは、コンパイラによって自動的に処理されます。非同期メソッドは、タスクの戻り値を暗黙的に「ラップ」します。

async Task<int> GetNumber() 
{ 
    return 42; 
} 

Task<int> GetNumber() 
{ 
    return Task.FromResult(42); 
} 
+0

にラップします。しかし、なぜこの例の 'BarAsync'は動作しませんか? – smoksnes

+0

@smoksnes「うまくいかない」のはどうですか? – spender

+0

私はタイプoを作ったに違いありません。それは動作します。 – smoksnes

1

対非同期キーワードがタスクでの方法の内容をラップ速記です。非同期メソッドの中に戻ると、コンパイラはそれをあなたのためのTaskにまとめます。たとえば、これら2つのメソッドは本質的に同じです:

関連する問題