如何解决Remix报错“Invalid implicit conversion from address to address payable”
报错触发原因
该报错是Solidity 0.5.0及以上版本的类型校验规则导致的:
- 0.5.0版本之后地址类型被拆分为两类:普通
address类型(无法直接接收ETH转账)、address payable类型(支持接收ETH转账) - 两类地址不支持隐式自动转换,必须显式声明转换逻辑
- 你使用的
Project合约构造函数的第一个入参要求是address payable类型,但msg.sender在外部函数中默认是普通address类型,直接传入就会触发类型不匹配报错
可行解决方法
以下三个方案任选其一即可,优先推荐前两个:
方案1:显式转换msg.sender为payable类型
直接修改传入Project构造函数的参数,给msg.sender做显式类型转换,修改后的代码如下:
Project newProject = new Project( payable(msg.sender), title, description, raiseUntil, amountToRaise );
适用场景:需要给Project合约中存储的项目发起者地址转账的场景。
方案2:修改Project构造函数的参数类型
如果你不需要给这个传入的发起者地址转账,可以直接调整Project合约的构造函数定义,将第一个入参的类型从address payable改为普通address:
// 原构造函数示例 constructor(address payable _owner, string calldata _title, ...) { // 修改后构造函数 constructor(address _owner, string calldata _title, ...) {
适用场景:项目逻辑中不需要给发起者地址直接转账的场景。
方案3:降级Solidity编译器版本
将Remix的编译器版本调整到0.4.25及以下的0.4.x版本,旧版本没有拆分address类型,不会触发该校验。不推荐该方案,0.4.x版本存在多个已知安全漏洞,会增加合约风险。
内容的提问来源于stack exchange,提问作者GGbro
相关产品推荐
相关产品推荐

