Ethereum Solidity 0.5.0:TypeError常量变量的初始值必须是编译时常量

Ethereum Solidity 0.5.0:TypeError常量变量的初始值必须是编译时常量,ethereum,solidity,Ethereum,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; } 在

为什么我不能以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;
}

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

constant uint256 FOO = 42;

function blah() {
    return FOO;
}
变成这样:

function blah() {
    return 42;
}

只有在编译时知道常量的值时,编译器才能执行此替换。在您的示例中,如果
\u decimals
是一个常量,理论上编译器可以计算出
decimals()
返回一个常量以及该值是什么,但Solidity编译器远没有那么智能。

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

constant uint256 FOO = 42;

function blah() {
    return FOO;
}
变成这样:

function blah() {
    return 42;
}
只有在编译时知道常量的值时,编译器才能执行此替换。在您的示例中,如果
\u decimals
是一个常量,理论上编译器可以计算出
decimals()
返回一个常量以及该值是什么,但Solidity编译器远没有那么聪明