2009-09-16 3 views
14

람다 식 스위치를 사용할 수 있습니까? 그렇지 않다면, 왜? Resharper는 오류로 표시합니다.람다 식 C# 스위치

+7

컴파일됩니까? 유효한 구문에 대한 마지막 단어로 Resharper를 사용하지 않을 것입니다. –

+0

물론 그렇지 않으며 컴파일 된 오류는 resharper의 출력과 동일합니다. 명령문 boody가있는 람다 식은 표현식 트리로 변환 할 수 없습니다. – Toto

+0

NB : 성명서 본문이 무엇인지 모르겠습니다. – Toto

답변

21

당신은 문 블록 람다 수 :

Action<int> action = x => 
{ 
    switch(x) 
    { 
    case 0: Console.WriteLine("0"); break; 
    default: Console.WriteLine("Not 0"); break; 
    } 
}; 

그러나 당신이 "하나의 표현 람다"에서 할 수 없으므로이 무효가 :

// This won't work 
Expression<Func<int, int>> action = x => 
    switch(x) 
    { 
    case 0: return 0; 
    default: return x + 1; 
    }; 

이 당신이 수 있음을 의미 표현 트리에서 스위치를 사용하지 마십시오 (적어도 C# 컴파일러에 의해 생성 된 것으로, 적어도 .NET 4.0은 라이브러리에서이를 지원합니다).

+0

네, 실제로 표현 트리를 원한다고 생각합니다. functino 경우 ifel보다 나은 작품이 있습니까? – Toto

+0

작은 교정 (뒤늦은 지혜에 ... 얼마나 좋은 지 궁금하다 :-)). C# 4.0 컴파일러는 여전히 "복잡한"표현식 ('if','while' ...)을 만들 수 없지만'Expression' 클래스를 사용하여 컴파일 할 수 있습니다. 두 가지는 분리되어 있습니다.그리고 뒤늦은 시야와 함께 : OP는 표현 나무에 대해 물었다. 두 번째'action'은 Expression Tree가 필요하고 대의원이 아니라는 것을 보여주기 위해'Expression >'이어야합니다. – xanatos

+0

@xanatos : 고마워, 수정했다. –

2

음, 이것이 작동하지 않아야하는 이유는 없습니다. 사용하는 구문에주의하십시오.

param => { 
    // Nearly any code! 
} 

delegate (param) { 
    // Nearly any code! 
} 

param => JustASingleExpression (No switches) 
5

예, 작동하지만 코드를 블록에 넣어야합니다. 예 :

private bool DoSomething(Func<string, bool> callback) 
{ 
    return callback("FOO"); 
} 

그런 다음, 그것을 전화 :

DoSomething(val => 
       { 
        switch (val) 
        { 
         case "Foo": 
          return true; 

         default: 
          return false; 
        } 
       }); 
2

내가 너무 :-)

[Test] 
public void SwitchInLambda() 
{ 
    TakeALambda(i => { 
     switch (i) 
     { 
      case 2: 
       return "Smurf"; 
      default: 
       return "Gnurf"; 
     } 
    }); 
} 

public void TakeALambda(Func<int, string> func) 
{ 
    System.Diagnostics.Debug.WriteLine(func(2)); 
} 

작품을 확인 잘 (출력 "스머프")! 에서

+2

람다식이 아니기 때문에. ** 람다 식 **은'Expression >'형식입니다. 그건 ** 람다 함수 **입니다. TakeAlambda의 입력 매개 변수를 변경하여 차이점을 확인하십시오. – xanatos

11

A, 당신이 얻을 수있는 가장 가까운 조건부 화합물이다 Expression (.NET 3.5) 순수 :

Expression<Func<int, string>> func = x => 
     x == 1 ? "abc" : (
     x == 2 ? "def" : (
     x == 3 ? "ghi" : 
       "jkl")); /// yes, this is ugly as sin... 

재미 아니 그것은 단지를 얻을 특히,. 당신은 (단지 LINQ - 투 - 객체와 함께 사용) 성명 시체와 함께 람다 식을 의미한다면, 아무것도 괄호 안에 법적 :

물론
Func<int, string> func = x => { 
     switch (x){ 
      case 1: return "abc"; 
      case 2: return "def"; 
      case 3: return "ghi"; 
      default: return "jkl"; 
     } 
    }; 

, 당신은 일을 외부에서 조달 할 수있을 것; MapType이 어디

var qry = from cust in ctx.Customers 
      select new {cust.Name, CustomerType = ctx.MapType(cust.TypeFlag) }; 

: 예 - 예를 들어, LINQ는 SQL은 -에 - 당신은 데이터 컨텍스트에 대한 방법 (데이터베이스에서) 스칼라 UDF (즉, 실제로 사용되지 않음) 매핑 할 수 있습니다 db 서버에서 작업을 수행하는 UDF.

+1

첫 번째 코드에서 괄호를 생략 할 수 있습니다. 결과는 * 많이 * 덜 못생긴 데 실제로 가끔 사용합니다. 틀림없이, 익숙해지기까지는 조금 걸리지 만, 상응하는'switch' 블록보다 본질적으로 읽기가 쉽지는 않습니다 (덜 논쟁합니다). –

+0

괄호가없는 경우 가끔 있습니다./: etc ...하지만 그렇습니다. 그것들 없이는 작동 할 수 있습니다. -p –

+0

@MarcGravell .Net 4.0의 순수한'Expression'에 대해서는 여전히 좋은 점이 있습니까? – ken2k