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

Using an enum for an instruction set for two bytecode interpreters with different word lengths in C#

我正在用 C# 为字节码解释器创建一个 class 库作为编码练习。我有两个字节码解释器,一个使用 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,
    ....
}

我是否遗漏了什么,或者我完全采用了错误的方法?

那样做泛型是行不通的,我建议的另一种方法是默认使用 long 作为类型,然后将其包装在 class 中,它根据操作码进行验证关于它是否是 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
}