2010-02-25 3 views
6

, 우리는 그래서 당신이 뭔가를 쓸 수 ... 중괄호 모든 표현을 실행하고, 마지막 값을 반환의 기본 동작을했다 컴파일러를 썼다 C#에서 뭔가 상응 하는가? 예를 들어, 부작용이있는 람다 함수를 작성하려고합니다. 람다 부작용 (단지 예)이 기능이있는 경우, 더 ... 혀짤배기에서 예를 들어, 당신이 prognC는 다시 학교에 # 범위 지정 연산자

답변

7

되어야한다, 블라드의 대답은 정확하고 당신은 람다 함수를 선언 할 필요가 없습니다 대의원. 컴파일러는 구문 람다식이 대리자 (예 Func<int>) 또는 식 트리 (예 Expression<Func<int>>)로 컴파일하며되어야하는지 결정할 수 없기 때문에 제외

이 상황은, C 번호와 같이 간단하지 않다, 그것은 임의의 것일 수있다 다른 호환 델리게이트 유형.

: - C# 컴파일러는 자동으로 대리자 형식을 추론 할 것이다 당신은 방법을 간단하게 대리자를 반환하는 방법을 정의하고 호출하여 코드를 약간 단순화 할 수

int foo = new Func<int>(() => { 
    Console.WriteLine("bar"); return 1; })(); 

: 그래서, 당신은 대리인을 작성해야

static Func<R> Scope<R>(Func<R> f) { return f; } 

// Compiler automatically compiles lambda function 
// as delegate and infers the type arguments of 'Scope' 
int foo = Scope(() => { Console.WriteLine("bar"); return 1; })(); 

나는 이것이 사용되어서는 안되는 못생긴 트릭 인 것에 동의한다. :-)하지만 재미있는 사실이다.

7

이의 부작용을 가지고에서 당신을 중지 거기에 아무것도에 대한 인

점 이하

람다 식.

Func<int> expr =() => 
{ 
    Console.WriteLine("bar"); 
    return 1; 
}; 
int foo = expr(); 
5
int foo = (() => { printf("bar"); return 1; })(); 

편집 : 건설적인 비판을 주셔서 감사합니다, 그것은 원칙적으로

int i = ((Func<int>)(() => { printf("bar"); return 1; }))(); 
+5

이것이 올바른 대답입니다. 즉, 심각하게 고려하지 않는 것이 좋습니다. –

+2

투표를하기 전에 코드가 컴파일되는지 실제로 확인하고 싶을 수도 있습니다. 그렇지 않습니다. -1. – Aaronaught

+0

네, 그렇습니다. printf는 C#에 존재하지 않습니다. 그러나 대답은 그것에 관한 것이 아닙니다. – Vlad

3

우리는 람다 정의에 대해 ()=>{M();}보다 더 간단한 구문을 사용하는 것을 고려해 보았지만 블록을 쉽게 읽을 수 있고 쉽게 혼동하지 않는 구문을 실제로 찾지도 못했습니다. 또는 배열 이니셜 라이저. 당신은 지금 람다 구문을 고수하고있다.