Blockchain 数据位置必须为";“记忆”;用于函数中的返回参数,但未给出任何值

Blockchain 数据位置必须为";“记忆”;用于函数中的返回参数,但未给出任何值,blockchain,ethereum,solidity,Blockchain,Ethereum,Solidity,我在混音中尝试了上面的solidity示例,solidity版本>0.5.0 但我现在得到了这个错误。 解决这个错误的方法是什么 contract MyContract { string value; function get() public view returns (string) { return value; } function set(string _value) public { value = _value;

我在混音中尝试了上面的solidity示例,solidity版本>0.5.0 但我现在得到了这个错误。 解决这个错误的方法是什么

contract MyContract {
    string value;

    function get() public view returns (string) {
        return value;
    }

    function set(string _value) public {
        value = _value;
    }

    constructor() public {
        value = "myValue";
    }
}

您应该为string参数添加memory关键字,这是solidity版本0.5.0中引入的

根据文件:

结构、数组或映射类型的所有变量的显式数据位置现在都是必需的。这也适用于函数参数和返回变量。例如,将uint[]x=m_x更改为uint[]storage x=m_x,将函数f(uint[]x)更改为函数f(uint[]memory x),其中内存是数据位置,可能会相应地被存储或调用数据替换。请注意,外部函数需要数据位置为calldata的参数

修正码

contract MyContract {
    string value;

    function get() public view returns (string memory) {
        return value;
    }

    function set(string memory _value) public {
        value = _value;
    }

    constructor() public {
        value = "myValue";
    }
}

请参考官方发布的版本0.5.0中所做的更改,Solidity每天都会更新,因此您应该了解所做的更改。为此,请继续参考更新的solidity文档

代码应该是这样的:

contract MyContract {
    string value;

    function get() public view returns (string memory) {
        return value;
    }

    function set(string memory _value) public {
        value = _value;
    }

    constructor() public {
        value = "myValue";
    }
}

contract MyContract {
    string value;

    function get() public view returns (string calldata) {
        return value;
    }

    function set(string calldata _value) public {
        value = _value;
    }

    constructor() public {
        value = "myValue";
    }
}
引用类型的值可以通过多个不同的 名字。将其与值类型进行对比,在值类型中可以获得独立的 每当使用值类型的变量时复制。因此,, 必须比值类型更仔细地处理引用类型。 目前,引用类型包括结构、数组和映射。如果 如果使用引用类型,则始终必须显式提供 存储类型的数据区域:内存(其生存期有限 对于外部函数调用),存储(状态 存储变量,其中生存期限制为 合同)或calldata(包含 函数参数)

警告

在版本0.5.0之前,数据位置可以省略,并根据变量类型、函数类型等默认为不同的位置,但所有复杂类型现在都必须给出明确的数据位置

因此,您必须将
内存
调用数据
放在字符串后面,如下所示:

contract MyContract {
    string value;

    function get() public view returns (string memory) {
        return value;
    }

    function set(string memory _value) public {
        value = _value;
    }

    constructor() {
        value = "myValue";
    }
}
需要注意的另一件事是,您不再需要在构造函数中公开:

警告:在版本0.7.0之前,必须指定 构造函数作为内部构造函数或公共构造函数