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