Solidity编译报错address无法隐式转换为address payable问题问询
报错修复方案
问题原因
Solidity自0.5版本起收紧了地址类型的隐式转换规则:msg.sender默认是普通address类型,无法直接赋值给声明为address payable的变量,也无法直接加入address payable类型的数组,必须做显式转换。
修复步骤
修改两处报错代码,给msg.sender套上payable()做显式类型转换:
- 构造函数内的赋值语句修改为
owner = payable(msg.sender); - fund函数内的数组push语句修改为
funders.push(payable(msg.sender));
修复后完整代码
contract FundMe { mapping(address =>uint256) public addressToAmountFunded; address payable[] public funders; address payable public owner; constructor() public { owner = payable(msg.sender); } function fund() public payable { uint256 minimumUSD = 50 * 10 ** 18; require(getConversionRate(msg.value) >= minimumUSD, "you need to spend more ETH my friend"); addressToAmountFunded[msg.sender] += msg.value; funders.push(payable(msg.sender)); } // 请补充实现getConversionRate函数,否则会触发函数未定义的编译报错 }
通用转换规则
后续如果需要把任意普通address类型变量转换为address payable,都可以用payable(普通地址变量)的语法完成显式转换。
内容的提问来源于stack exchange,提问作者Nat Serrano
相关产品推荐
相关产品推荐

