Delegate parameter name shadows type name

Jonathan M Davis via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Jan 9 11:38:42 PST 2017


On Monday, January 09, 2017 11:18:02 Ali Çehreli via Digitalmars-d-learn 
wrote:
> 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.

Well, stuff inside a function is quite free to shadow stuff from outside of
it. AFAIK, the only shadowing that's prevented is declarations in a function
shadowing other declarations in a function.

- Jonathan M Davis




More information about the Digitalmars-d-learn mailing list