2016-10-13 3 views
1
나는 주위 놀겠다는 거하고 다음 컴파일하지 않을 것을 발견했다

:중첩 된 람다 구문

Func<int> a = ((j) => (() => 3 * j))(1); 

이 나에게 유효한 문 것 같아, 다음과 같은 동등한 문은 파이썬에서 작동 (?) :

print (lambda x: lambda: 3 * x)(1)() 

이것은 익명의 기능이 런타임에서 처리되는 방식의 결과일까요?

+1

컴파일러 오류를 공유하면 도움이됩니다. – Bernhard

+0

아무도 이런 종류의 지원을 구현하지 않은 이유는 단순히 람다를 만든 다음 즉시 호출하는 것이 의미가 없으므로 식을 간단하게 단순화하고 컴파일 할 수 있기 때문입니다. –

+1

그것은 확실히 흥미 롭다. 그러나 옆줄에, 이것이 실제적으로 어떤 용도일까요? –

답변

4

이 C#에서 하지만 - 그것은 명시 적 캐스트 괄호가 많이 필요합니다

Func<int> a = ((Func<int, Func<int>>)(j =>() => 3 * j))(1); 

또는 유사

Func<int, Func<int>> x = j =>() => 3 * j; 
Func<int> a = x(1); 

내가 여기에 문제가 생각을 C#은 일반적으로 람다의 타입을 추론 할 수 없습니다 - 람다가 그것이 배정 된 캐스트, 변수, 매개 변수 등의 타입과 만 일치 하는지를 검사 할 수 있습니다. 귀하의 버전에서 바깥 쪽 람다 (x)에 지정된 유형이 없습니다.