Всем привет.
Так можно:
using Nemerle.Extensions;
class EventRaiser
{
public event Ev : Action;
}
class Cls
{
public Raiser : EventRaiser = EventRaiser() <-{
Ev += () => Handler()
}
Handler() : void
{
}
}
А почему так нельзя?
using Nemerle.Extensions;
class EventRaiser
{
public event Ev : Action;
}
class Cls
{
public Raiser : EventRaiser = EventRaiser() <-{
Ev += Handler()
}
Handler() : void
{
}
}
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Здравствуйте, DarthSidius, Вы писали:
DS>А почему так нельзя?
DS>DS>using Nemerle.Extensions;
DS>class EventRaiser
DS>{
DS> public event Ev : Action;
DS>}
DS>class Cls
DS>{
DS> public Raiser : EventRaiser = EventRaiser() <-{
DS> Ev += Handler()
DS> }
DS> Handler() : void
DS> {
DS> }
DS>}
DS>
Ты вызываешь метод Handler, который возвращает void.
Видимо имелось в виду следующее:
Ev += Handler
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, DarthSidius, Вы писали:
DS>>А почему так нельзя?
DS>>DS>>using Nemerle.Extensions;
DS>>class EventRaiser
DS>>{
DS>> public event Ev : Action;
DS>>}
DS>>class Cls
DS>>{
DS>> public Raiser : EventRaiser = EventRaiser() <-{
DS>> Ev += Handler
DS>> }
DS>> Handler() : void
DS>> {
DS>> }
DS>>}
DS>>
H>Ты вызываешь метод Handler, который возвращает void.
H>Видимо имелось в виду следующее:
H>H>Ev += Handler
H>
Сори опечатка, конечно же без скобок. Я подписываюсь на событие. Через лямбду работает, а напрямую — нет.
По идее, эквивалентно:
class EventRaiser
{
public event Ev : Action;
}
class Cls
{
public Raiser : EventRaiser = EventRaiser();
public this()
{
Raiser.Ev += Handler
}
Handler() : void
{
}
}
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Здравствуйте, vvv848165@ya.ru, Вы писали:
VYR>Здравствуйте, DarthSidius, Вы писали:
DS>> Ev += Handler()
VYR>может в этой строке ошибка ? надо наверное посмотреть сто компилятор пишет
VYR>Ev += Handler
VYR>Ev += new ... Handler ...
Слово new в Nemerle не используется для конструирования объектов.
Компилятор:
error : ``this'' or ``base'' usage before base is constructed
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Здравствуйте, DarthSidius, Вы писали:
Компилятор собирает конструктор следующим образом:
инициализаторы полей
вызов конструктора базового типа
тело рукописного конструктора
Оператор <- работает как единое целое, и подписка на событие оказывается в выражении, инициализирущем поле.
Твой пример можно ещё больше упростить:
class MyClass
{
Action A = Handler; // ошибка
Handler() : void {}
}
В компилятор встроена достаточно консервативная логика, запрещающая использовать в инициализаторах полей члены типа, поведение скопировано с компилятора C#.
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, DarthSidius, Вы писали:
H>Компилятор собирает конструктор следующим образом:
H>
H>инициализаторы полей
H>вызов конструктора базового типа
H>тело рукописного конструктора
H>
Странно как то... Ладно, хоть через лямбды можно
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>