Czy można włączyć przełącznik w wyrażeniu lambda? JEŚLI nie, dlaczego? Resharper wyświetla to jako błąd.Przełącznik C# w wyrażeniu lambda
Odpowiedz
Można w lambda bloku oświadczenie:
Action<int> action = x =>
{
switch(x)
{
case 0: Console.WriteLine("0"); break;
default: Console.WriteLine("Not 0"); break;
}
};
Ale nie można tego zrobić w „pojedynczym lambda wyrażenie”, więc jest nieprawidłowy:
// This won't work
Expression<Func<int, int>> action = x =>
switch(x)
{
case 0: return 0;
default: return x + 1;
};
oznacza, że może to użyj przełącznika w drzewie wyrażeń (przynajmniej tak jak jest generowany przez kompilator C#, wierzę, że .NET 4.0 przynajmniej ma wsparcie dla niego w bibliotekach).
tak naprawdę wydaje się, że problemem jest chcę drzewo wyrażenie. Czy jest jakaś praca lepsza niż jeśli els, jeśli o functino? – Toto
Niewielka korekta (z perspektywy czasu ... jak wiele dobrego jest z perspektywy czasu :-)). Kompilator C# 4.0 nadal nie może budować "złożonych" Wyrażeń (z 'if',' while' ...), ale można je zbudować za pomocą klasy 'Expression'. Te dwie rzeczy są oddzielone.I z mniejszym opóźnieniem: OP zapytał o drzewa ekspresji. Drugim "działaniem" powinno być 'Wyrażenie
@xanatos: Dzięki, edytowałem. –
Hmm, nie widzę powodu, dla którego to nie powinno działać. Po prostu zachowaj ostrożność używając składni której używasz
param => {
// Nearly any code!
}
delegate (param) {
// Nearly any code!
}
param => JustASingleExpression (No switches)
Tak, działa, ale musisz umieścić swój kod w bloku. Przykład:
private bool DoSomething(Func<string, bool> callback)
{
return callback("FOO");
}
Następnie nazwać:
DoSomething(val =>
{
switch (val)
{
case "Foo":
return true;
default:
return false;
}
});
Sprawdziłem to zbyt :-)
[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));
}
działa dobrze (wyjścia "Smurf")!
Ponieważ to nie jest wyrażenie Lambda. ** Wyrażenie Lambda ** byłoby typu 'Wyrażenie
w czystej Expression
(.NET 3.5), najbliżej można dostać to związek warunkowy:
Expression<Func<int, string>> func = x =>
x == 1 ? "abc" : (
x == 2 ? "def" : (
x == 3 ? "ghi" :
"jkl")); /// yes, this is ugly as sin...
nie zabawa, zwłaszcza gdy robi się skomplikowane. Jeśli masz na myśli wyrażenie lambda z korpusem instrukcji (tylko do użytku z LINQ-Objects), a następnie wszystko jest legalne wewnątrz szelki:
Func<int, string> func = x => {
switch (x){
case 1: return "abc";
case 2: return "def";
case 3: return "ghi";
default: return "jkl";
}
};
Oczywiście, może być w stanie zlecić pracę; na przykład LINQ-SQL pozwala zmapować skalarne UDF (w bazie danych) sposobu na danych-kontekstem (który w rzeczywistości nie jest używany) - na przykład:
var qry = from cust in ctx.Customers
select new {cust.Name, CustomerType = ctx.MapType(cust.TypeFlag) };
gdzie jest MapType
UDF, który wykonuje pracę na serwerze db.
Możesz pominąć nawiasy w swoim pierwszym kodzie - wynik jest * znacznie * mniej brzydki i czasami go używam. Trzeba przyznać, że trochę się przyzwyczaja, ale nie jest to z natury mniej czytelne niż równoważny blok "switch" (mniej, twierdzę). –
Bez nawiasów czasami się gubię? /: etc ... ale tak, może działać bez nich ;-p –
@MarcGravell Czy nie ma nic lepszego dla czystego 'Expression' w .Net 4.0? – ken2k
- 1. KeyValuePair w wyrażeniu Lambda
- 2. Aspectj: Pointcut w wyrażeniu lambda
- 3. Podkwerenda w wyrażeniu lambda lub LINQ
- 4. Jak używać zmiennych lokalnych w wyrażeniu lambda
- 5. zły typ zwrotu w wyrażeniu lambda
- 6. Czy złym zwyczajem jest zawsze uchwycić wszystko w wyrażeniu lambda?
- 7. C# przełącznik/przerwa
- 8. C# przełącznik z typów
- 9. Funkcja autouzupełniania ReSharpera z anonimowymi typami w wyrażeniu lambda
- 10. Jak sprawdzić wartości zerowe w głębokim wyrażeniu lambda?
- 11. Sprawdź, czy właściwość ma wartość null w wyrażeniu lambda
- 12. Różnica w statycznym wyrażeniu lambda kompilatora CSC i Roslyn?
- 13. lambda wyrażenia z zewnętrznych zmiennych niezmiennych stosowanych w wyrażeniu
- 14. Negating Func <T, bool> w wyrażeniu lambda
- 15. Lambda-Over-Lambda w C++ 14
- 16. lambda w C++ 03
- 17. Symulowanie metod C# Lambda w JavaScript
- 18. C++ 11 lambda w decltype
- 19. C# wyrażeń lambda bez deklaracji zmiennej/parametru?
- 20. Przełęcz lambda wyrażenie argumentem lambda C++ 11
- 21. Int.Parse w wyrażeniu Linq
- 22. C# Bezimienne parametry lambda
- 23. C: Sprawa przełącznik z operatorem logicznym
- 24. C++ statyczne wydajność lambda
- 25. C++ zamknięcie z lambda
- 26. C++ 11: lambda, currying
- 27. Przełącznik liczby w ciąg
- 28. błąd składni w wyrażeniu warunkowym
- 29. Co oznacza tylda w wyrażeniu?
- 30. Efekty uboczne w wyrażeniu typeof()
Czy to się kompiluje? Nie użyłbym Resharpera jako ostatniego słowa na temat prawidłowej składni. –
Oczywiście, że tak nie jest, a skompilowany błąd jest taki sam, jak wynik wyświetlany przez resharper: Wyrażenie lambda z instrukcją boody nie może zostać przekierowane do drzewa wyrażeń. – Toto
NB: Nie wiem, co to jest ciało oświadczenia. – Toto