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

时间:2015-10-30 15:59:35

标签: c# .net regex il

此代码

  Regex regex = new Regex("blah", RegexOptions.Singleline & RegexOptions.IgnoreCase);
编译后的

在ILSpy中显示如下:

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

为什么会发生这种情况,并且它可能是正则表达式在.Net 3.5中不匹配的原因吗?在4.5它工作。

1 个答案:

答案 0 :(得分:14)

RegexOptions.Singleline & RegexOptions.IgnoreCase

是按位AND,并解析为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

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

    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。我刚编译了你的代码,ILSpy也输出了:

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

按预期。