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