Placement of shared does not allow to set a delegate

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Jun 16 21:35:09 PDT 2014


On 06/16/2014 09:37 AM, Tolga Cakiroglu wrote:

 > On Monday, 16 June 2014 at 15:25:51 UTC, Ali Çehreli wrote:

 > Okay, now I continue with another thing. After defining the event
 > attribute as follows
 >
 > public void delegate( shared(SocketListener) sender ) shared
 > eventWhenStarted;
 >
 >
 > ---
 >
 >
 > I removed the "shared" keyword from that method
 >
 > public void listener_whenStarted( shared(SocketListener) sender ){}
 >
 >
 > ---
 >
 >
 > Then set the attribute as follows
 >
 > listener.eventWhenStarted = cast(shared)(&listener_whenStarted);
 >
 >
 > ---
 >
 >
 > There is error again.
 >
 > main.d(21): Error: cannot implicitly convert expression
 > (&this.listener_whenStarted) of type shared(void
 > delegate(shared(SocketListener))) to shared(void
 > delegate(shared(SocketListener)))
 >
 > ---
 >
 > This error is important, because both types are completely same:
 >
 > main.d(21): Error: cannot implicitly convert expression
 > (&this.listener_whenStarted) of type
 >
 > shared(void delegate(shared(SocketListener)))
 > to
 > shared(void delegate(shared(SocketListener)))

The second type is different with dmd 2.066:

Error: cannot implicitly convert expression (&this.listener_whenStarted) 
of type

shared(void delegate(shared(SocketListener)))
to
shared(void delegate(shared(SocketListener)) shared)

However, I may have misunderstood your description. This is the code I 
tried:

class SocketListener
{
     public void delegate( shared(SocketListener) sender ) shared 
eventWhenStarted;
}

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

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

void main()
{}

 > ---
 >
 > Can this be a bug?

I don't know but I theorize like this: :) There are three 'shared' 
qualifiers in the last error message.

shared(void delegate(shared(SocketListener)) shared)

1) The 'shared' in the middle: That one makes the delegate take a 
shared(SocketListener) argument when it gets called.

2) The 'shared' on the right-hand side: (I am not sure about this one.) 
That one makes the context pointer of the delegate 'shared'. For 
example, the delegate can only be called on a shared class object.

3) The 'shared' on the left-hand side: That one makes the type of the 
delegate shared so that e.g. such a delegate can be passed between threads.

That's what I understand.

Ali



More information about the Digitalmars-d-learn mailing list