请求的从 uint256[10] 内存到 uint256[] 内存的隐式转换无效

Soh*_*hir 5 dynamic-arrays solidity

所以显然我们不能在使用内存数据位置时使用动态数组。但下面的代码给了我错误:

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract A {
    uint256[] public numbers;
    
    constructor(uint256[] memory _numbers) {
        for(uint256 i=0; i<_numbers.length; i++) {
            numbers.push(_numbers[i]);
        }
    }

    function get() public view returns (uint256[] memory) {
        return numbers;
    }
}

contract Manager {
    function makeA() public returns(uint256) {
        uint256[10] memory numbers;
        // push is not supported for memory data location of array
        numbers[0] = 10;

        A a = new A(numbers); //Error: Invalid implicit conversion from uint256[10] memory to uint256[] memory requested

        return a.numbers(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用声明静态数组的语法解决了这个问题:

uint256[] memory numbers = new uint256[](5);
Run Code Online (Sandbox Code Playgroud)

虽然它解决了问题,但我仍然对为什么后者有效的概念感到困惑?我的假设是,uint256[] 和 uint256[10] 之间的类型不同。如果我错了,请纠正我,对这种行为的解释也会有所帮助。

MrF*_*oid 0

区别如下:

首先,静态数组在定义时将分配其内存槽。

然而,每次将新元素推入动态数组时,动态数组都需要发出新的分配。

在普通的 OOP 语言中,这似乎不是什么大事,但 Solidity 需要每条指令的 Gas,这就是这种差异不容忽视的地方。