Solidity
作為其他合約中的介面與列舉進行互動
在其他契約中使用列舉作為介面的問題:將感謝您的幫助…
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.9; interface interEnum { enum SIDE { buy, sell } } contract B is interEnum { function bEnum(SIDE side) external { // do something with here } } contract A { B b; enum NUM { buy, sell } function bEnum(NUM num) external { // i cant pass in an enum from here. // invalid explicit conversion from uint256 to Enum when i tried it this way // b.bEnum(uint256(num); // b // invalid explicit conversion from enum to enum.... // b.bEnum(num); } }
Solidity 不允許從
A.NUM
to隱式轉換interEnum.SIDE
,也不允許像b.bEnum(SIDE(num))
. 由於您b.bEnum()
將SIDE
其作為參數,因此您應該interEnum.SIDE
只傳遞類型的參數。contract A is interEnum { B b; function bEnum(SIDE num) external { b.bEnum(num); } }
我擺弄並清理了一下,所以 Type 只在一個地方聲明(DRY)。
您可以將列舉轉換為數字,但您必須通過中間轉換才能到達那裡。由於列舉中只有兩個成員,因此它適合 a
uint8
以便可以進行轉換。您必須先去那裡才能轉換為uint256
.在大多數情況下,您幾乎不會在列舉和數字之間進行轉換。數字通常意味著某種梯度,而當您需要硬編碼的類別或狀態時,列舉使事情更具可讀性。
無論如何,這將按預期編譯和工作。
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.9; library Types { enum Side { buy, sell } } contract B { event TookSide(string side); function bEnum(Types.Side side) external { // Do something with it here if(side == Types.Side.buy) emit TookSide("buy"); if(side == Types.Side.sell) emit TookSide("sell"); } } contract A { B b; constructor(address _b) { b = B(_b); } function takeSide(Types.Side side) external returns(uint thing) { b.bEnum(side); thing = uint256(uint8(side)); } }
[ { "from": "0xd9145CCE52D386f254917e481eB44e9943F39138", "topic": "0x39053e506755f3eaf8479a64ca6444658a68a5886c5992c63649ab2d3cd476d8", "event": "TookSide", "args": { "0": "sell", "side": "sell" } } ]
希望能幫助到你。