为什么 RegexOptions 在 MSIL 中被编译为 RegexOptions.None?

Why RegexOptions are compiled to RegexOptions.None in MSIL?

此代码

  Regex regex = new Regex("blah", RegexOptions.Singleline & RegexOptions.IgnoreCase);

编译后在 ILSpy 中看起来像这样:

  Regex regex = new Regex("blah", RegexOptions.None);

为什么会出现这种情况,是否是.Net 3.5 中正则表达式不匹配的原因?在 4.5 上有效。

RegexOptions.Singleline & RegexOptions.IgnoreCase

是按位与,解析为0(即RegexOptions.None)。

RegexOptions 枚举如下所示:

[Flags]
public enum RegexOptions
{
    None = 0,
    IgnoreCase = 1,
    Multiline = 2,
    ExplicitCapture = 4,
    Compiled = 8,
    Singleline = 16,
    IgnorePatternWhitespace = 32,
    RightToLeft = 64,
    ECMAScript = 256,
    CultureInvariant = 512,
}

所以,在二进制中,我们有:

RegexOptions.SingleLine == 10000 
RegexOptions.IngoreCase == 00001

当应用按位与时,我们得到:

    10000 
AND 00001
    -----
    00000

替换为

RegexOptions.Singleline | RegexOptions.IgnoreCase

给出:

    10000 
 OR 00001
    -----
    10001

ILSpy 将在以下位置进行反编译:

Regex regex = new Regex("blah", RegexOptions.Singleline | RegexOptions.IgnoreCase);

但我不知道 .Net 4.5 中的 "works" 是什么。我刚刚编译了你的代码,ILSpy 也输出:

Regex regex = new Regex("blah", RegexOptions.None);

符合预期。