On 06/16/2014 05:35 AM, Tolga Cakiroglu wrote:> In a class I defined an event attribute as follows:
>
> public void delegate( shared(SocketListener) sender ) eventWhenStarted;
>
> ---
>
> An instance of SocketListener is created.
>
> auto listener = new shared SocketListener();
>
> ---
>
> I defined a shared method that will be called when the event occurs.
>
> public void listener_whenStarted( shared(SocketListener) sender ) shared{}
>
> ---
>
> I set the event attribute of listener to defined method:
>
> listener.eventWhenStarted = &listener_whenStarted;
>
> ----
>
> Here is the error message:
>
> main.d(21): Error: cannot implicitly convert expression
> (&this.listener_whenStarted) of type void
> delegate(shared(SocketListener) sender) shared to shared(void
> delegate(shared(SocketListener)))
>
>
> If we look at types separately as follows:
>
> .......void delegate(shared(SocketListener) sender) shared
> shared(void delegate(shared(SocketListener)))
>
>
> Isn't the first type same as the second one?
>
>
> (1.5 years later, I still hate the `shared` keyword. It is nothing but
> confusion and extra coding for many programmers.)

Here is a minimal example that reproduces the issue and the hint that compiles the code:

class SocketListener
{
    public void delegate( shared(SocketListener) sender )
    /* shared */    // <-- UNCOMMENT TO COMPILE
    eventWhenStarted;
}

class C
{
    this()
    {
        auto listener = new shared SocketListener();
        listener.eventWhenStarted = &listener_whenStarted;
    }

public void listener_whenStarted( shared(SocketListener) sender ) shared
    {}
}

void main()
{}

Error: cannot implicitly convert expression (&this.listener_whenStarted) of type void delegate(shared(SocketListener) sender) shared to shared(void delegate(shared(SocketListener)))

Ali

Reply via email to