Delegate parameter name shadows type name
    Ali Çehreli via Digitalmars-d-learn 
    digitalmars-d-learn at puremagic.com
       
    Mon Jan  9 11:18:02 PST 2017
    
    
  
This is something that surprised me in a friend's code.
(A "friend", hmmm? No, really, it wasn't me! :) )
// Some type of the API
struct MyType {
     int i;
}
// Some function of the API that takes a delegate
void call(void delegate(MyType) dlg) {
     dlg(MyType(42));
}
void main() {
     /* The programmer simply copied the delegate definition from
      * the function and used it as-is when passing a lambda: */
     call(delegate void(MyType) {
             /* WAT? Does the following really compile? After all,
              * MyType.i is NOT a static member! */
             if (MyType.i == 42) {
                 // ...
             }
         });
}
I was surprised to see it compiled and worked but of course MyType at 
the lambda definition inside main() is not a type name, rather the 
parameter name. Surprising, but I think this is according to spec.
Ali
    
    
More information about the Digitalmars-d-learn
mailing list