使用Solidity ^ 0.5.0, 我实际上正在尝试实现在^ 0.4.17中工作的旧代码,但它在Remix上引发错误。 我检查了语法和所有内容,但无法捕捉到问题所在。 任何帮助表示高度赞赏。
pragma solidity ^0.5.0;
contract Lottery{
address public manager;
address[] public players;
constructor() public {
manager = msg.sender;
}
function participate() public payable {
require(msg.value > .01 ether);
players.push(msg.sender);
}
function pseudoRandom() private view returns(uint){
return uint(keccak256(abi.encodePacked(block.difficulty, now, players)));
}
function pickWinner() public {
uint index = pseudoRandom() % players.length;
players[index].transfer(address(this).balance);
}
}
这是错误消息:
browser / Lottery.sol:22:8:TypeError:在依赖于参数之后找不到或不可见成员“ transfer” 在地址中查找。
players [index] .transfer(address(msg.sender).balance);
^ --------------------- ^
答案 0 :(得分:5)
请参阅Solidity v0.5.0 Breaking Changes。
如here所指出:
地址类型分为地址和应付地址,其中只有应付地址提供转移功能。
有关更多详细信息,请参见我的答案here。
更改此行:
address[] public players;
对此:
address payable[] public players;
编辑
感谢smarx!
答案 1 :(得分:2)
您在初始声明中缺少payable修饰符。 更改
地址[]公共玩家;
到
应付地址[]公共玩家;