2017-11-23 7 views
2

익명의 방법 또는 람다 아니라 하나에 할당 할 수있는 유형 Action대리인이 방법은 다음 코드에

class Program 
{ 
    static async Task Work() 
    { 
     await Task.Delay(1000); 
    } 

    static async Task Main() 
    { 
     // Action a = Work; 
     Action b = async() => await Task.Delay(1000); 
     Action c = async delegate() { await Task.Delay(1000); }; 
    } 
} 

대리자가 입력 Task 방법 Work에 할당 될 수 없지만 이상하게 할당 될 수있다 익명 메서드 또는 Task 유형의 람다로 변환합니다. 나의 이해에서

  • async delegate() { await Task.Delay(1000); }
  • async() => await Task.Delay(1000)
    • Work
    • Action에 호환되지 않는 동일한 서명을해야합니다. 이 불일치의 원인은 무엇입니까?

      편집 :

      다음 람다 익명 방법

      • async() => await Task.Delay(1000)
      • async delegate() { await Task.Delay(1000); }

      모두 Action 또는 Func<Task> 할당의 왼쪽에 따라 나타낼 수있다. 더 정확하게,

      암시 Func<Task>로 변환

      • Action a = async() => await Task.Delay(1000)
      • Action b = async delegate() { await Task.Delay(1000); }

      , 암시 적으로 Action로 변환

      • Func<Task> a = async() => await Task.Delay(1000)
      • Func<Task> b = async delegate() { await Task.Delay(1000); }

      @ JSteward의 의견은 약입니까? 모든

    +2

    '작업'은 '작업'이 아닙니다. 람다 또는 델리게이트를 지정할 때'async void' 메쏘드를 생성하는 반면'Work'는'Task'를 반환합니다. 대신에 그 메소드를'Func'에 할당 할 수 있습니다. – JSteward

    +0

    "비동기 무효 메서드를 만드는 람다 또는 델리게이트를 할당 할 때"<--- 오 진짜? 감사! –

    답변

    5

    첫째, Action는 반환 형식 void의 대리자입니다 :

    public delegate void Action() 
    

    및 방법은 반환 형식 Task 있습니다.

    둘째, 람다 식으로 만든 익명 메서드의 반환 형식은 대리자 형식 (Action)에 따라 결정됩니다. 위임은 void이므로 익명 메소드 void을 작성합니다. Task.Delay 호출의 반환 값은 무시됩니다.

    또한 익명의 함수 delegate()Task이 아닌 것으로 가정합니다.return 문이 없으므로 유형이 void입니다. 할 수 없습니다

    Action c = async delegate() { return await Task.Delay(1000); }; 
    

    가 대리자를 반환

    익명 함수는 무효로 변환 오류 메시지를 제공합니다 : 당신이 하나를 추가 한 경우이 유형 void의 대리자에 할당하려고하기 때문에 심지어, 컴파일되지 것 값을 반환하십시오.

    +0

    물론이 사실을 알고 있습니다. –

    +0

    @ArtificialStupidity가 나아 졌습니까? – Adrian

    2

    작업은 작업의 반환 유형이있는 함수이므로 작업에 넣을 수 없습니다. 작동하여 exemples위한

    유일한 이유는 람다 함수

    () => Task.Delay(1000); 
    

    가 Task.Delay (1000)를 호출하는 동작을 생성한다는 것이다.

    void Function() 
    { 
        Task.Delay(1000); 
    } 
    

    그리고 당신은 비동기 람다를 만들 때

    async() => await Task.Delay(1000); 
    

    는 Task.Delay (1000) 기다리고 액션을 만듭니다.

    async void Function() 
    { 
        await Task.Delay(1000); 
    } 
    

    익명 기능에도 동일하게 적용됩니다.

    P.

    비동기 함수를 기다리면 작업 출력이 "유형"(이 경우 void)으로 변경됩니다. Thats 왜 당신이 Task.Delay (1000) 기다리고 있다면, 당신은 반환 유형에 대한 무효.