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

Reply via email to