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

前端之家收集整理的这篇文章主要介绍了c# – 为什么在MSIL中将RegexOptions编译为RegexOptions.None?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这段代码
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

是按位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);

如预期.

猜你在找的C#相关文章