Здравствуйте, Евгений Коробко, Вы писали:
ЕК>Основным применением для анонимных делегатов я видел такое: ЕК>this.BeginInvoke(delegate (string s) {textbox1.Text = s;}, "123"); ЕК>Но оказывается, так нельзя Почему — хз. ЕК>cannot convert from 'anonymous method' to 'System.Delegate'
По порядку:
1) Никаких анонимных делегатов в природе не существует
2) Анонимные методы появились в C# 2.0
3) В 3.0 появились лямбды
4) BeginInvoke — угробище. Как по дизайну (правильные пацаны используют AsyncOperation, либо SynchronizationContext напрямую), так и по сигнатуре. Достаточно поменять сигнатуру так:
public void BeginInvoke(Action<string> method)
и можно будет писать так:
BeginInvoke(s => textBox1.Text = s)
Но даже с существующей сигнатурой можно написать так (могу немножко наврать, проверять лень):
BeginInvoke((Action)(() => textBox1.Text = "O La La"))
P.S. Стиль общения а-ля flame.* здесь лучше сменить.
... << RSDN@Home 1.2.0 alpha 4 rev. 1036 on Windows Vista 6.0.6001.65536>>
Здравствуйте, bexab, Вы писали:
B>Здравствуйте, AndrewVK, Вы писали:
B>известны ли мотивы, запрещающие делать так ?
B>
B>object o = delegate() { return 0; };
B>
B>Error => Cannot convert anonymous method block to type 'object' because it is not a delegate type
Потому что это анонимный метод а не делегат. Тебе же написали. Если за тебя компилятор делает некоторую работу, например, создает делегат, это еще ничего не значит. Ну например, один и тот же код:
var y=Array.Find(a, x => x==1);
[/с#]
Красиво - но обманчиво. Лямбда - не делегат, а анонимный метод. Уберем некоторый синтаксический сахар, получится:
[c#]
var y=Array.Find(a, new Predicate<int>(x=>x==1));
Синтаксический сахар шарпа не требует явное создание делегата. Оно это делает за нас.
соответсвенно, если мы хотим из метода сделать делегат, то его нужно создать:
object o=new Predicate<int>(x=>x==1);
Или
Predicate<int> b = (x => x == 2);
Разница между методом, и типизированным делегатом — большая Просто иногда за нас эту разницу нивелирует компилятор.
... << RSDN@Home 1.2.0 alpha rev. 789>>
Re[3]: C# 3.0 и анонимные делегаты - разочарование