On 08.01.23 12:29, thebluepandabear wrote:
```D
interface ICustomDrawable {
     void render(sfRenderWindow* renderWindow);
}
[...]> class Button : ICustomDrawable {
[...]
}
[...]
class StackLayout : ICustomDrawable {
[...]
     ICustomDrawable[] _children;
}
```

For some reason, when I want to cast the `children` (property), only the second example works:

1.

```D
foreach (Button button; cast(Button[])(_boardSizeRow.children)) {
     button.update(event, _renderWindow);
}
```

2.

```D
foreach (Button button; to!(Button[])(_boardSizeRow.children)) {
     button.update(event, _renderWindow);
}
```

Two things you need to know:

1. While an interface reference implicitly converts to a compatible class reference, the resulting pointer is slightly different.

----
interface I {}
class C : I {}
void main()
{
    C c = new C;
    I i = c;
    import std.stdio;
    writeln(cast(void*) c); /* e.g. 7F3C140A7000 */
    writeln(cast(void*) i); /* e.g. 7F3C140A7010 */
}
----

2. Casting from one array type to another is done "as a type paint"[1]. The elements of the array are reinterpreted, not converted.

But reinterpreting interface references as class references won't work, because the pointers will be wrong. You need to convert each element of the array (which is what `to` does).


[1] https://dlang.org/spec/expression.html#cast_array

Reply via email to