简单的测试/用例,有一个应付款函数,应该直接把钱寄给所有者。我得到了错误,就像标题一样。代码:
address private owner;
constructor() {
owner = msg.sender;
}
function makePay() public payable {
owner.transfer(msg.value);
} 现在,如果我尝试声明address private payable owner;,就会得到错误Expected identifier but got payable。
另外,如果我尝试address payable private owner;,然后在构造函数中得到错误type address is not implicitly convertible to expected type address payable。
我怎么才能解决这个问题?我在这里缺少的基本原则是什么?新知识和新知识,谢谢。
发布于 2021-10-28 17:48:52
最近版本(>0.8.0)的正确语法是:
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;
contract YourContract {
address payable private owner;
constructor() {
owner = payable(msg.sender);
}
function makePay() public payable {
owner.transfer(msg.value);
}
}另外,如果我尝试地址支付私人所有者;那么在我的构造函数中,错误类型地址不能隐式转换为预期类型地址。
这是因为msg.sender的类型是地址,而不是默认的应付款地址。您必须将地址显式标记为按设计支付的地址。如本例所示,您将msg.sender变量转换为使用应付款(Your_address)的应付款地址类型。
您还可以将演员阵容推迟到实际需要的时候:
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;
contract YourContract {
address private owner;
constructor() {
owner = msg.sender;
}
function makePay() public payable {
payable(owner).transfer(msg.value);
}
}最基本的原则是,由于您要传输有价值的令牌,所以定义语言时必须显式地允许它这样做。
https://ethereum.stackexchange.com/questions/112430
复制相似问题