我正在用C#创建一个类库,用于字节码解释器作为编码练习。我有两个字节码解释器,一个使用32位字,另一个使用64位字。我想创建一个在两个解释器之间共享的统一指令集。
我想过使用泛型来解决这个问题,就像我在C ++中使用模板一样:
(C ++代码)
template<typename T>
enum Instruction : T {
add,
subtract,
...
}
我希望32位解释器使用Instruction<int32>
而64位解释器使用Instruction<int64>
。
然而,经过一些研究后,我没有找到一种方法在C#中使用枚举。
此C#代码无法编译:
enum Instruction<T> : T {
Add,
Subtract,
....
}
我在这里缺少什么,还是我完全采取了错误的方法?
答案 0 :(得分:3)
做类似的泛型工作,我建议的另一种方法是默认使用long
作为类型,然后将其包装在验证操作码的类中,具体取决于是否它是32位还是没有。
public enum Opcode : long
{
Add = 0L,
Subtract = 1L,
...
}
public class Instruction
{
public Opcode Opcode { get; }
public Instruction(Opcode opcode)
{
if (is32Bit && ((long)opcode) > int.MaxValue)
throw new InvalidOperationException();
Opcode = opcode;
}
}
另一个选择是使用条件编译作为Dmitry建议
#if IS_64_BIT
public enum Opcode : long
#else
public enum Opcode : int
#endif
{
Add = 0,
Subtract = 1,
#if IS_64_BIT
Multiply = long.MaxValue
#endif
}