Страницы

Поиск по вопросам

понедельник, 4 февраля 2019 г.

C#: Создать и вызвать анонимную функцию внутри выражения

Есть ли способ в C# создать и вызвать анонимную функцию внутри выражения? Без предварительного объявления переменной-делегата. Что-то вроде этого:
int i32 = () => { int x = 5; int y = 6; return( x+y ); }();
или
int i32 = (() => { int x = 5; int y = 6; return( x+y ); })();
или
int32 = this.Invoke( () => { int x = 5; int y = 6; return( x+y ); } );
Работающий вариант #1 от @PashaPash и @Pavel Mayorov:
int i32 = ((Func)(() => { int x = 5; int y = 6; return( x+y ); }))();
Работающий вариант #2 от @Stack:
int i32 = new Func(() => { int x = 5; int y = 6; return (x+y); })();
Работающий вариант #3 от @Stack: (чемпион по краткости, по красоте - для ценителей)
int i32; new Action(() => { int x = 5; int y = 6; i32 = x + y; })();
Ответ на вопрос @Stack "Зачем это надо?:" Для красоты и компактности, требуется редко, вот пример:
int i1 = 5 + 6; int i2 = 7 + 8; int i3 = ((Func)(() => { int x = 45; int y = 6; return( x*2 + y*3 ); }))(); int i4 = 9 + 10; int i5 = 11 + 20; int i6 = new Func(() => { int x; if( CheckState( out x ) ) return( x ); else return( -1 ) })(); int i7 = new Func(() => { int x = 0; while( CheckSomthing( x )) x++; return( x ); })();
Вот, ещё один пример из реальной жизни:
Style s = new Style(); s.TargetType = typeof(System.Windows.Controls.ComboBox); s.Setters.Add(new Setter(System.Windows.Controls.ComboBox.FontSizeProperty, 11.0)); s.Setters.Add(new Setter(System.Windows.Controls.ComboBox.BackgroundProperty, ((Func)(() => { Brush b = new SolidColorBrush( Color.FromArgb( 255, 200, 200, 200 )); b.Freeze(); return b; }))() )); s.Setters.Add(new Setter(System.Windows.Controls.ComboBox.ForegroundProperty, Brushes.Black)); s.Setters.Add(new Setter(System.Windows.Controls.ComboBox.FontFamilyProperty, new FontFamily("Arial"))); s.Setters.Add(new Setter(System.Windows.Controls.ComboBox.FontWeightProperty, FontWeights.Bold));


Ответ

Это можно сделать вот так:
var q = ((Func)(() => { int x = 5; int y = 6; return( x+y ); }))()
Это - единственный способ.

Комментариев нет:

Отправить комментарий