On 1/4/19 7:16 PM, kdevel wrote:
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?
Yes. If the requested interface or class isn't a base class, or a base
interface, then a downcast must be involved. Essentially the downcast is
a runtime check to see if this class instance actually is a derived one,
or a derived class implements the specified interface. D does not have
multiple inheritance.
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.
Of course it applies :) The fact that the class is not an instance of D
in a derived class means that it returns null. The spec statement could
be worded better.
OTOH upcasting is also
not covered by part 2 and seems to be legal:
Upcasting is trivial, and the compiler will not even spend time doing a
runtime check, it knows how to do this at compile time. It doesn't even
require a cast.
Just like casting a short to an int doesn't require a cast, but you are
free to put one in if you like.
-Steve