在地址 payable[] 存储 ref 中进行参数相关查找后,成员 "push" 未找到或不可见

Member "push" not found or not visible after argument-dependent lookup in address payable[] storage ref

在语句 players.push(msg.sender); 中出现以下错误:

在地址 payable[] 存储 ref.

中进行参数相关查找后,未找到或不可见成员“push”

因此我无法在 solidity 中推送地址 payable 数组。这里有什么解决方法?

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0;

contract Lottery {
    address public manager;
    address payable[] public players;

    constructor() {
        manager = msg.sender;
    }

    function enter() public payable {
        players.push(msg.sender);            // ERROR IN THIS LINE
    }
}

如果您使用 Solidity 0.7 进行编译,一切正常。

此错误显示在 Solidity 0.8 中,这是因为在 0.8 中 msg.sender 不再自动 payable。所以你需要先做到payable:

players.push(payable(msg.sender));

我必须明确地将 msg.sender 转换为 payable 才能使其正常工作。

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0;

contract Lottery {
    address payable public manager;
    address payable[] public players;
    
    constructor() {
        manager = payable(msg.sender);
    }
    
    function enter() public payable {
        players.push(manager);
    } 
}

参考文献:

Casting from address to address payable

TypeError: push is not detected as a function for address payable dynamic array