C# 在C中为两个具有不同字长的字节码解释器的指令集使用枚举#
我正在用C#为字节码解释器创建一个类库,作为编码练习。我有两个字节码解释器,一个使用32位字,另一个使用64位字。我想创建一个统一的指令集,在两个口译员之间共享 我想过使用泛型来解决这个问题,就像我在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 {
模板
枚举指令: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位指令?您将无法使用附加位。