람다 식 스위치를 사용할 수 있습니까? 그렇지 않다면, 왜? Resharper는 오류로 표시합니다.람다 식 C# 스위치
답변
당신은 문 블록 람다 수 :
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은 라이브러리에서이를 지원합니다).
네, 실제로 표현 트리를 원한다고 생각합니다. functino 경우 ifel보다 나은 작품이 있습니까? – Toto
작은 교정 (뒤늦은 지혜에 ... 얼마나 좋은 지 궁금하다 :-)). C# 4.0 컴파일러는 여전히 "복잡한"표현식 ('if','while' ...)을 만들 수 없지만'Expression' 클래스를 사용하여 컴파일 할 수 있습니다. 두 가지는 분리되어 있습니다.그리고 뒤늦은 시야와 함께 : OP는 표현 나무에 대해 물었다. 두 번째'action'은 Expression Tree가 필요하고 대의원이 아니라는 것을 보여주기 위해'Expression
@xanatos : 고마워, 수정했다. –
음, 이것이 작동하지 않아야하는 이유는 없습니다. 사용하는 구문에주의하십시오.
param => {
// Nearly any code!
}
delegate (param) {
// Nearly any code!
}
param => JustASingleExpression (No switches)
예, 작동하지만 코드를 블록에 넣어야합니다. 예 :
private bool DoSomething(Func<string, bool> callback)
{
return callback("FOO");
}
그런 다음, 그것을 전화 :
DoSomething(val =>
{
switch (val)
{
case "Foo":
return true;
default:
return false;
}
});
내가 너무 :-)
[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));
}
작품을 확인 잘 (출력 "스머프")! 에서
람다식이 아니기 때문에. ** 람다 식 **은'Expression
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.
첫 번째 코드에서 괄호를 생략 할 수 있습니다. 결과는 * 많이 * 덜 못생긴 데 실제로 가끔 사용합니다. 틀림없이, 익숙해지기까지는 조금 걸리지 만, 상응하는'switch' 블록보다 본질적으로 읽기가 쉽지는 않습니다 (덜 논쟁합니다). –
괄호가없는 경우 가끔 있습니다./: etc ...하지만 그렇습니다. 그것들 없이는 작동 할 수 있습니다. -p –
@MarcGravell .Net 4.0의 순수한'Expression'에 대해서는 여전히 좋은 점이 있습니까? – ken2k
컴파일됩니까? 유효한 구문에 대한 마지막 단어로 Resharper를 사용하지 않을 것입니다. –
물론 그렇지 않으며 컴파일 된 오류는 resharper의 출력과 동일합니다. 명령문 boody가있는 람다 식은 표현식 트리로 변환 할 수 없습니다. – Toto
NB : 성명서 본문이 무엇인지 모르겠습니다. – Toto