2012-11-06 2 views
2

나는이 C# 컴파일러 오류에 부딪 혔고 컴파일러가 람다 유형을 추론 할 수 없다는 오류 메시지가 잘못된 것 같습니다.비동기 램버스 형식 유추에서 잘못된 C# 컴파일러 오류 메시지

Func<object> lambda = async() => { return await Task.FromResult(1); }; 

를 여기에서 컴파일러 오류입니다 : 여기에 코드의 관련 부분이다 나는 아주 이해가 안

error CS4010: Cannot convert async lambda expression to delegate type ' System.Func<object> '. An async lambda expression may return void , Task or Task<T> , none of which are convertible to ' System.Func<object> '.

부분은 마지막 문장이다. 람다는 실제로 Task<int>을 반환하지만 컴파일러는 왜 그것을 System.Func<object>으로 변환해야한다고 생각합니까?

반면에 오류 메시지가 전달하려고하는 것이 있다면 System.Func<object>System.Func<Task<int>>을 할당 할 수 없다는 것입니다. 일반 대리인 공분산의 덕분으로 보이지 않습니다. 이는 대신 잘 작동 함을 의미합니다.

Func<object> lambda = new Func<Task<int>>(async() => { return await Task.FromResult(1); }); 
+0

컴파일러는 변수를 선언 한 방식이고 비동기 델리게이트와 호환되지 않기 때문에'System.Func '으로 변환해야합니다. –

+1

* 비동기 메서드의 반환 유형은 void, 작업 또는 작업이어야합니다. * –

답변

2

The lambda is indeed returning Task<int> , but why does the compiler think that it should try to convert it to System.Func<object> ?

나는 오류 메시지가 제대로 나가셨 믿습니다. 람다 (반환 될 수있는 타입은 void, Task 또는 Task<T> 일 수 있음)를 유도하고 람다Func<object>으로 변환하려고합니다. Microsoft Connect에서보다 명확한 오류 메시지를 요청하는 문제를 제기하는 것이 좋습니다.

On the other hand, if what the error message is trying to convey is that System.Func<Task<int>> cannot be assigned to System.Func<object> , that doesn't seem to be the case thanks to generic delegate covariance

True이지만 컴파일러는 대부분의 표현식보다 "나중"까지 람다 식의 유형을 결정하지 않습니다. 컴파일러에서는 Func<Task<int>>을 볼 수 없습니다 (인수를 사용하지 않고 Task 또는 Task<int>을 반환하는 람다 식 표현 만 보임) 따라서 일반 대리인 차이는 사용하지 않습니다.

나는 에릭 Lippert가 async 람다식이 해결되는 방법에 대한 블로그 게시물을 특히, 메소드 과부하 선택의 경우에 수행하기를 바라고 있습니다.

+0

감사합니다. 스티븐 감사합니다. 오해의 소지가있는 오류 메시지는 정확하게 제가 염려했던 것입니다. 보고하기 전에 몇 가지 빠른 의견을 보내고 싶었습니다. 여기에서 방금했습니다 (https://connect.microsoft.com/VisualStudio/feedback/details/770315/wrong-c-compiler-error-message-on-async -lambda-type-inference). – Simone