Почему так нельзя?
От: DarthSidius  
Дата: 26.06.20 05:32
Оценка:
Всем привет.
Так можно:
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>>
♠♠♥♠♠♦♥
Re: Почему так нельзя?
От: vvv848165@ya.ru  
Дата: 26.06.20 05:41
Оценка:
Здравствуйте, DarthSidius, Вы писали:

DS> Ev += Handler()


может в этой строке ошибка ? надо наверное посмотреть сто компилятор пишет

Ev += Handler
Ev += new ... Handler ...
Re: Почему так нельзя?
От: hardcase Пират http://nemerle.org
Дата: 26.06.20 09:17
Оценка:
Здравствуйте, 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
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Почему так нельзя?
От: DarthSidius  
Дата: 26.06.20 10:50
Оценка:
Здравствуйте, 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>>
♠♠♥♠♠♦♥
Re[2]: Почему так нельзя?
От: DarthSidius  
Дата: 26.06.20 10:50
Оценка:
Здравствуйте, 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>>
♠♠♥♠♠♦♥
Re[3]: Почему так нельзя?
От: hardcase Пират http://nemerle.org
Дата: 26.06.20 12:44
Оценка:
Здравствуйте, DarthSidius, Вы писали:

Компилятор собирает конструктор следующим образом:
  1. инициализаторы полей
  2. вызов конструктора базового типа
  3. тело рукописного конструктора

Оператор <- работает как единое целое, и подписка на событие оказывается в выражении, инициализирущем поле.

Твой пример можно ещё больше упростить:
class MyClass
{
  Action A = Handler;  // ошибка

  Handler() : void {}  
}


В компилятор встроена достаточно консервативная логика, запрещающая использовать в инициализаторах полей члены типа, поведение скопировано с компилятора C#.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Почему так нельзя?
От: DarthSidius  
Дата: 28.06.20 00:46
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, DarthSidius, Вы писали:


H>Компилятор собирает конструктор следующим образом:

H>

    H>
  1. инициализаторы полей
    H>
  2. вызов конструктора базового типа
    H>
  3. тело рукописного конструктора
    H>

Странно как то... Ладно, хоть через лямбды можно
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
♠♠♥♠♠♦♥
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.