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)。