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

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

概述这段代码 Regex regex = new Regex("blah", RegexOptions.Singleline & RegexOptions.IgnoreCase); 编译后在ILSpy中看起来像这样: Regex regex = new Regex("blah", RegexOptions.None); 为什么会发生这种情况,并且它是正则表达式在.Net 3.5中不匹配的原因吗?在4. 这段代码
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# – 为什么在MSIL中将RegexOptions编译为RegexOptions.None?全部内容,希望文章能够帮你解决c# – 为什么在MSIL中将RegexOptions编译为RegexOptions.None?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1236400.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存