2016-08-08 2 views
2

TaskTask<String>으로 반환하는 함수가 있습니다. Task 내에서 await을 여러 번 호출해야하므로 익명의 async 함수를 사용해야합니다. 내가 널 오류를 반환하려고하면비동기 익명 함수를 실행하는 작업 내에서 반환 유형은 무엇입니까?

익명 기능이

비동기 람다 표현식이 변환 값을 반환 할 수 대리자를 반환 무효로 변환 (비주얼 스튜디오 메시지) 발생하지만 내가 ""를 반환 할 수 있다는 것을 발견했다 '작업'대리자가 값을 반환 할 수 없습니다. '과제'를 돌려 주시겠습니까?

여기서 무슨 일이 벌어지고 같은 문제

public virtual Task<String> FooBar() 
{ 
    return Task<String>.Run(async() => 
    { 
     await Task.Delay(1500); 
     return ""; // OK 
     //return null; // Error 
    }); 
} 

을 보여주는 기능? 내가 널 값을 반환하려는 경우

그것은 return await Task.FromResult<String>(null);에 더 적합 할 것인가?

+1

왜 처음에는 'Task.Run'을 사용하고 있습니까? 당신은 CPU 바운드 작업이 없으며 비동기 작업이 있습니다. 단순히 여기에서 아무것도 수행하지 않아서 전화를 완전히 제거하십시오. 이 기본 클래스의 정적 메소드의로 – Servy

+2

그것은 주목할 필요가'작업 .Run' 정확히 Task.Run''과 동일합니다. 컴파일러는 여전히'Run'에 제공된 델리게이트로부터 리턴 타입을 추론 할 필요가 있습니다 (이것은 계속 진행하기 위해'null'만으로는 할 수 없습니다). –

+0

@CharlesMager 다른 "문제"를 이해하고 정리합니다. Visual Studio에서는 ''부분이 약간 희미 해 지므로 필요하지 않습니다. 나는 그것이 어떻게 든 타입을 유추하고 있다는 것을 알았지 만, 지금 그것이 정확히 어떻게되는지를 알 수 있습니다. 방법 @Servy – KDecker

답변

2

컴파일러는 null이 문자열의 null임을 알지 못하므로 올바른 유형 Func<Task<string>>을 자동으로 선택할 수 없습니다. 대신 컴파일러에게 null이 문자열임을 알리기 위해 다음을 수행하십시오. 코멘트에서 자랐다로


return (string)null; 

또한, Task.Run<TResult>(Func<Task<TResult>> function)Task<String>.Run(...을 수행 할 때 그래서 당신은 여전히 ​​별도의 정보와 같은 정적 메소드 Task.Run를 호출 정적 방법이다. 당신이 대신 할 필요하면 전화 및 string 일 대신 컴파일러 시도를 만들고 반환 형식이 있어야 할 무엇인지 알아 내기 위해 반환 형식을 강제 Run 부분에서 유형을 통과합니다.

public virtual Task<String> FooBar() 
{ 
    return Task.Run<String>(async() => 
    { 
     await Task.Delay(1500); 
     return null; // Does not error 
    }); 
} 
+0

그냥 나를 이길! 또는,'Task.Run '을 사용할 수 있습니다. –

+0

참고로,'Task (...)'대신'Task.Run (...)'을 사용할 수 있습니다. .Run (...)' –

+1

또는'default (string)' –

관련 문제