if (auto x = cast(C) x)

Steven Schveighoffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Aug 9 18:12:39 PDT 2017


On 8/9/17 5:54 PM, Q. Schroll wrote:
> For a class/interface type `A` and a class `C` inheriting from `A` one 
> can do
> 
>    A a = getA();
>    if (auto c = cast(C) a)
>    { .. use c .. }
> 
> to get a `C` view on `a` if it happens to be a `C`-instance.
> 
> Sometimes one cannot find a good new name for `c` while there is no 
> advantage of accessing `a` when `c` is available. D does not allow to 
> shadow `a` in the if-auto declaration for good reasons. How about 
> relaxing the rule for cases like these, where the rhs is the lhs with a 
> cast to derived?
> 
>    if (auto a = cast(C) a)
>    { .. use a typed as C .. }
> 
> One can think of `a` being *statically* retyped to `C` as this is a 
> (strictly) better type information. Internally, it would be a shadowing, 
> but it does not matter as the disadvantages don't apply (if I didn't 
> miss something).

Just FYI, swift implemented something like this, and I find it 
completely awful.

In Swift, they made all parameters to functions immutable (head 
immutable), and if you want to modify the variable, you have to do:

var x = a

But for existing code that declared parameters to be mutable (so you 
don't have to change too much), they allow:

var a = a

Which is terrible. I find this proposal would look equally terrible.

Sorry, I would be against it.

-Steve


More information about the Digitalmars-d-learn mailing list