immutable auto a = Array!int([1, 2, 3]);
Run Code Online (Sandbox Code Playgroud)
错误:无法隐式转换表达式(((Array!int __slArray2557 = Array(RefCounted(RefCountedStore(null)));),_ _ slArray2557).this([1,2,3]))类型为Array!int to immutable(Array !INT)
通常我只是想在运行时创建一些对象,初始化它然后使它不可变但是如果我尝试这样做,我从上面得到错误.
似乎我可以将一个可变对象强制转换为一个不可变对象
immutable auto a = cast(immutable Array!int) Array!int([1, 2, 3]);
Run Code Online (Sandbox Code Playgroud)
为什么我要把它投到immutable?
铸就不变甚至合法吗?
由于Array是引用计数,它现在与不可变权不兼容 - 它保持指向其中的引用计数的指针,如果它是不可变的则不会改变,从而破坏整个事物.演员只是绕过了规则,这些规则编译但是未定义的行为.
如果它是不可变的,只需抛弃Array包装并使用普通的切片:
// this works fine
immutable a = [1, 2, 3];
Run Code Online (Sandbox Code Playgroud)
(哎呀,如果你传递一个文字,那么数组包装器基本上没用了,因为普通的数组只是为了传递给它的构造函数,它再次被构造!)
BTW autoin immutable auto是不必要的,你可以调用它immutable.
你也可以创建一个可变数据的可变数组,它也应该工作 - 由于它的内存管理方案,它只需要可变性.