To maybe clarify a bit more.
MyINameable := MyTNameable;
That is not just an assignment. That is a conversion.
If you look at the memory in each of the 2 variables, then MyINameable will not contain a copy of MyTNameable.
It will contain an interface.
The compiler retrieved that data (the interface) as part of the assignment. Hence its a conversion.
As for PascalDragons "array of" example. Here the compiler could in theory generate code to iterate the entire array and convert each value.
However the compiler does not. It simple isn't implemented in the compiler to do that.
When you take a TFPGList then the compiler actually can't even do the iterate. It couldn't do it, even if someone wanted to add that to the compiler.
It would need to trace all places where a TNameable might potentially be stored in that class, and it would need to convert them all.
However, IIRC some of those classes (and IIRC that includes TFPGList) just allocate memory. E.g. for storage they use something like either "Array of byte" or "PByte".
The code accesses that with the correct typecasts.
But if the compiler would want to figure out where it needs to convert some TNameAble, then it wouldn't know about PByte.