在C#中为两个不同字长的字节码解释程序使用enum作为指令集

问题描述:

我在C#中为字节码解释程序创建了一个类库,作为编码练习。我有两个字节码解释器,一个使用32位字,另一个使用64位字。我想创建一个在两位口译员之间共享的统一指令集。在C#中为两个不同字长的字节码解释程序使用enum作为指令集

我想使用泛型来解决这个问题,就像我会使用C++模板:

(C++代码)

template<typename T> 
enum Instruction : T { 
    add, 
    subtract, 
    ... 
} 

而且我本来有32位翻译使用Instruction<int32>和64位解释器使用Instruction<int64>

但是,在做了一点研究之后,我没有找到一种在C#中使用enum的泛型方法。

此C#代码不会编译:

enum Instruction<T> : T { 
    Add, 
    Subtract, 
    .... 
} 

有我丢失的东西在这里还是我采取错误的做法完全?

+1

为什么不分享32位指令都解释之间设置?或者如果你想有2个类库 - 使用[条件编译](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives/preprocessor-if)。 – Dmitry

+0

如果你希望你的指令集是统一的,为什么需要64位指令?您将无法使用额外的位。 – IllidanS4

这样做的泛型不起作用,我建议的另一种方法是默认使用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; 
    } 
} 

另一种选择是使用条件编译为梅德建议

#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 
}