C# 3.0 и анонимные делегаты - разочарование
От: Евгений Коробко  
Дата: 28.03.08 22:10
Оценка:
Основным применением для анонимных делегатов я видел такое:

this.BeginInvoke(delegate (string s) {textbox1.Text = s;}, "123");

Но оказывается, так нельзя Почему — хз.

cannot convert from 'anonymous method' to 'System.Delegate'
Евгений Коробко
Re: C# 3.0 и анонимные делегаты - разочарование
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.03.08 23:10
Оценка: 2 (2) +3
Здравствуйте, Евгений Коробко, Вы писали:

ЕК>Основным применением для анонимных делегатов я видел такое:

ЕК>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>>
AVK Blog
Re: C# 3.0 и анонимные делегаты - разочарование
От: geHucKa  
Дата: 30.03.08 18:52
Оценка:
public void InvokeFoo(string s)
{
    this.Invoke((MethodInvoker)delegate
    {
        Foo(s);
    });
}


Так не подойдёт?
Пользуясь случаем, передаю привет маме, папе и брату! :Р
Re[2]: C# 3.0 и анонимные делегаты - разочарование
От: bexab  
Дата: 31.03.08 09:33
Оценка: :)
Здравствуйте, AndrewVK, Вы писали:

известны ли мотивы, запрещающие делать так ?

object o = delegate() { return 0; };


Error => Cannot convert anonymous method block to type 'object' because it is not a delegate type
Re[3]: C# 3.0 и анонимные делегаты - разочарование
От: GlebZ Россия  
Дата: 31.03.08 09:51
Оценка: 6 (1)
Здравствуйте, 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 и анонимные делегаты - разочарование
От: _FRED_ Черногория
Дата: 31.03.08 09:56
Оценка:
Здравствуйте, bexab, Вы писали:

B>известны ли мотивы, запрещающие делать так ?

B>object o = delegate() { return 0; };

B>Error => Cannot convert anonymous method block to type 'object' because it is not a delegate type

Известны и обсуждались не раз. Разобраться в этом самому — весьма увлекательное занятие, помогающее лучше узнать роль и значение делегатов.
... << RSDN@Home 1.2.0 alpha 4 rev. 1048>>
Help will always be given at Hogwarts to those who ask for it.
Re[3]: C# 3.0 и анонимные делегаты - разочарование
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 31.03.08 10:33
Оценка: 2 (1)
Здравствуйте, bexab, Вы писали:

B>известны ли мотивы, запрещающие делать так ?


B>
B>object o = delegate() { return 0; };
B>


http://blogs.gotdotnet.ru/personal/bezzus/PermaLink.aspx?guid=6563e9d7-60e2-441c-984e-75d88df2f7d3
... <<RSDN@Home 1.2.0 alpha 4 rev. 1052 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[2]: C# 3.0 и анонимные делегаты - разочарование
От: Евгений Коробко  
Дата: 31.03.08 12:52
Оценка:
Сделал так:

private delegate void OneParameterDelegate<ParamType>(ParamType param);

...

this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
new OneParameterDelegate<int>(delegate(int percent){m_ProgressBar1.Value = percent;}), 50);
Евгений Коробко
Re[3]: C# 3.0 и анонимные делегаты - разочарование
От: Lloyd Россия  
Дата: 31.03.08 15:36
Оценка:
Здравствуйте, Евгений Коробко, Вы писали:

ЕК>Сделал так:


ЕК>private delegate void OneParameterDelegate<ParamType>(ParamType param);


ЕК>...


ЕК>this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,

ЕК> new OneParameterDelegate<int>(delegate(int percent){m_ProgressBar1.Value = percent;}), 50);


Зачем? Чем не устроил вариант AVK-то?
... << RSDN@Home 1.2.0 alpha rev. 786>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.