On Friday, 4 January 2019 at 20:21:56 UTC, Steven Schveighoffer wrote:
missing in the source. But why is d a null reference in the first place?

Because when you dynamically cast one object or interface to another object or interface, and that result is not possible (if you remove ",D" from the example you quoted, then neither A nor B implement D), then the result is null.

I overlooked that Alex wrote

   class A

and not

   class A : D

which I came across in the examples in #10 and #11 of

   https://dlang.org/spec/interface.html

and to which I referred to in my OP.

https://dlang.org/spec/expression.html#cast_expressions

See parts 2 and 3.

   part 2
   "Any casting of a class reference to a derived class reference
is done with a runtime check to make sure it really is a downcast.
   null is the result if it isn't."

Part 2 is about downcasting. Does that apply here? Due to the omission of ": D" in Alex' example the cast is not a cast "to a derived class reference" and hence this part does not apply. OTOH upcasting is also
not covered by part 2 and seems to be legal:

part 2 at its face value:
```part2.d
import std.stdio;

class A {
   void foo () { __FUNCTION__.writeln; }
}

class B : A {
   override void foo () { __FUNCTION__.writeln; }
}

void main ()
{
   auto x = new B;
   auto u = cast (A) x;
   typeof (u).stringof.writeln;
   u.foo;
}
```
$ ./part2
A
part2.B.foo


Reply via email to