Cannot implicitly convert expression of type const(string[]) to string[]

tsbockman thomas.bockman at gmail.com
Sat Jan 9 04:14:39 UTC 2021


On Saturday, 9 January 2021 at 02:07:50 UTC, Ali Çehreli wrote:
> The destination is immutable(char)[].

No, it's not. string[] means immutable(char)[][] - note the 
second set of brackets.

> Even though the source is 'const ref', other.text is a copy of 
> the slice object (the pointer and the length). Because the 
> elements are immutable, other.text cannot mutate value.text.

The elements are not immutable. Each element is an mutable slice 
of immutable characters.

> > Your code has a logical inconsistency
>
> I don't see where. I think this is one of those too strict 
> cases of D where I unhappily slap a cast and move on.

The cast you propose breaks the type system. For example:

module app;

import std.stdio;

struct Value
{
     int value;
     string data;
     string[] text;
}

void test(const ref Value value) @trusted // Don't do this!
{
     Value other = void;
     other.text = cast(string[]) value.text; // This cast is 
@system for good reason.
     other.text[0] = "Oops";
}

void main() @safe
{
     immutable(Value) row = {
         value: 10,
         data: "ttttggg",
         text: [ "Don't change me, bro!" ]
     };

     writeln(row.text);
     test(row);
     writeln(row.text);
}



More information about the Digitalmars-d-learn mailing list