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

C# 在C中为两个具有不同字长的字节码解释器的指令集使用枚举#,c#,generics,enums,bytecode,C#,Generics,Enums,Bytecode,我正在用C#为字节码解释器创建一个类库,作为编码练习。我有两个字节码解释器,一个使用32位字,另一个使用64位字。我想创建一个统一的指令集,在两个口译员之间共享 我想过使用泛型来解决这个问题,就像我在C++中使用模板一样: (C++代码) 模板 枚举指令:T{ 添加 减去, ... } 我会让32位解释器使用指令,而64位解释器使用指令 然而,在做了一点研究之后,我没有找到在C#中使用枚举的泛型的方法 此C#代码不会编译: enum Instruction<T> : T {

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

我想过使用泛型来解决这个问题,就像我在C++中使用模板一样:

(C++代码)

模板
枚举指令:T{
添加
减去,
...
}
我会让32位解释器使用
指令
,而64位解释器使用
指令

然而,在做了一点研究之后,我没有找到在C#中使用枚举的泛型的方法

此C#代码不会编译:

enum Instruction<T> : T {
    Add,
    Subtract,
    ....
}
enum指令:T{
添加
减去,
....
}

我是否有什么地方遗漏了,或者我采取了完全错误的方法

像那样做泛型是行不通的,我建议的另一种方法是默认为类型使用
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
}

像这样做泛型是行不通的,我建议的另一种方法是默认为类型使用
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
}

为什么不在两个解释器之间共享32位指令集?或者如果你想有两个类库-使用。如果你想你的指令集是统一的,为什么需要64位指令?您将无法使用额外的位。为什么不在两个解释器之间共享32位指令集?或者如果你想有两个类库-使用。如果你想你的指令集是统一的,为什么需要64位指令?您将无法使用附加位。