Solidity轮盘合约调用随机数合约时接口类型转换编译错误求助
报错原因
你遇到的编译错误是**变量名遮蔽(Name Shadowing)**导致的:setRandomNumberGenerator函数的入参名和合约全局状态变量randomNumberGenerator完全重名,Solidity在函数作用域内会优先使用局部入参变量。你写的赋值语句本质是试图把IRandomNumberGenerator接口类型的实例,赋值给address类型的入参变量,因此触发类型不匹配报错。
修复方案
推荐使用第一种方案,符合通用Solidity开发规范:
方案1:修改入参名避免重名
给入参加下划线前缀和全局状态变量做区分:
function setRandomNumberGenerator(address _randomNumberGenerator) external onlyOwner { randomNumberGenerator = IRandomNumberGenerator(_randomNumberGenerator); }
方案2:显式指定全局状态变量
如果不想修改入参名,可以通过this.明确指定赋值对象为合约全局状态变量:
function setRandomNumberGenerator(address randomNumberGenerator) external onlyOwner { this.randomNumberGenerator = IRandomNumberGenerator(randomNumberGenerator); }
额外问题提醒
修完上述问题后编译还会触发数组类型不匹配报错:你定义的randomNumbers是固定长度数组uint256[100],但expand函数返回的是动态长度数组uint256[] memory,二者无法直接赋值。可以将状态变量声明修改为动态数组即可解决:
// 替换原有的uint256[100] internal randomNumbers; uint256[] internal randomNumbers;
内容的提问来源于stack exchange,提问作者Oblivion
相关产品推荐
相关产品推荐

