Internet Explorer 11 中的 64 位枚举标志
64-bit enum flag in Internet Explorer 11
我们正在通过 Web 从我们的 C# 后端向我们的客户端浏览器发送一个 64 位枚举 API 2. 应用程序的要求之一是它应该 运行 在 Windows 10 x64 with ie11
。但是,当我启动 ie11
时,我得到两个进程,默认情况下一个 64 位和一个 32 位。 64 位枚举是否适用于 ie11?如果它不能处理超过 32 个标志,我们不想使用枚举选项。
我们正在使用 TypeScript
来处理标志并使用 Webpack 将其编译为 ES5。
我们使用 TypeLITE 生成 TypeScript 定义。
http://type.litesolutions.net/
C# 模型:
[Flags]
[TsEnum(Module = "Application")]
public enum ValidationErrorType : Int64
{
None = 0,
NoCaseForRenewalCycle = 1 << 0, // 1
RegistrationNumberExists = 1 << 1, // 2
ApplicationNumberMissing = 1 << 2, // 4
FeeCalculationNoPrice = 1 << 3, // 8
//...
}
TypeLite.Net4, Enums.ts:
namespace Application {
export const enum ValidationErrorType {
None = 0,
NoCaseForRenewalCycle = 1,
RegistrationNumberExists = 2,
ApplicationNumberMissing = 4,
FeeCalculationNoPrice = 8
}
}
浏览器进程位数在这里根本不重要。但重要的是 javascript 没有 64 位整数这样的东西。 Javascript 有 number
类型,基本上是 C# double
。因此,javascript 不能安全地表示大于 2^53-1 的整数(Number.MAX_SAFE_INTEGER
常量)。此外,所有位运算符(<<
、|
等)都将数字作为 32 位整数处理,这也无助于这种情况。例如,1 << 32
在 javascript 中的计算结果为 1
。
因此,您的 64 位打字稿枚举是一个雷区,可能会导致难以检测到错误,因此我会避免使用它。
如果你无法避免它 - 你必须使用一些能够处理 64 位数字的库,例如 BigJS(但我想你不能使用 typescript enum
)。
我们正在通过 Web 从我们的 C# 后端向我们的客户端浏览器发送一个 64 位枚举 API 2. 应用程序的要求之一是它应该 运行 在 Windows 10 x64 with ie11
。但是,当我启动 ie11
时,我得到两个进程,默认情况下一个 64 位和一个 32 位。 64 位枚举是否适用于 ie11?如果它不能处理超过 32 个标志,我们不想使用枚举选项。
我们正在使用 TypeScript
来处理标志并使用 Webpack 将其编译为 ES5。
我们使用 TypeLITE 生成 TypeScript 定义。
http://type.litesolutions.net/
C# 模型:
[Flags]
[TsEnum(Module = "Application")]
public enum ValidationErrorType : Int64
{
None = 0,
NoCaseForRenewalCycle = 1 << 0, // 1
RegistrationNumberExists = 1 << 1, // 2
ApplicationNumberMissing = 1 << 2, // 4
FeeCalculationNoPrice = 1 << 3, // 8
//...
}
TypeLite.Net4, Enums.ts:
namespace Application {
export const enum ValidationErrorType {
None = 0,
NoCaseForRenewalCycle = 1,
RegistrationNumberExists = 2,
ApplicationNumberMissing = 4,
FeeCalculationNoPrice = 8
}
}
浏览器进程位数在这里根本不重要。但重要的是 javascript 没有 64 位整数这样的东西。 Javascript 有 number
类型,基本上是 C# double
。因此,javascript 不能安全地表示大于 2^53-1 的整数(Number.MAX_SAFE_INTEGER
常量)。此外,所有位运算符(<<
、|
等)都将数字作为 32 位整数处理,这也无助于这种情况。例如,1 << 32
在 javascript 中的计算结果为 1
。
因此,您的 64 位打字稿枚举是一个雷区,可能会导致难以检测到错误,因此我会避免使用它。
如果你无法避免它 - 你必须使用一些能够处理 64 位数字的库,例如 BigJS(但我想你不能使用 typescript enum
)。