可靠性0.5.0:TypeError常数变量的初始值必须是编译时常数

时间:2019-01-09 00:22:28

标签: ethereum solidity

为什么我不能以这种方式在Solidity 0.5.0中声明一个常量?使用最新版本,一切都很好:

uint256 public constant INITIAL_SUPPLY = 10000 * (10 ** uint256(decimals()));

/**
 * @return the number of decimals of the token.
 */
function decimals() public view returns (uint8) {
    return _decimals;
}

1 个答案:

答案 0 :(得分:2)

在Solidity中,常量不会存储在任何地方的存储中;它们被替换为字节码。大概是这样的:

constant uint256 FOO = 42;

function blah() {
    return FOO;
}

变成这样:

function blah() {
    return 42;
}

仅当常量值在编译时为 时,编译器才能执行此替换。在您的示例中,如果_decimals是一个常数,则从理论上讲,编译器可能会发现decimals()返回一个常数以及该值是什么,但是Solidity编译器远没有那么聪明。