使用枚举为C#中具有不同字长的两个字节码解释器的指令集

时间:2017-10-15 21:44:21

标签: c# generics enums bytecode

我正在用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,
    ....
}

我在这里缺少什么,还是我完全采取了错误的方法?

1 个答案:

答案 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
}