2015-10-30 3 views
6

ILSpyでこのようなコンパイル後RegexOptionsがMSILのRegexOptions.Noneにコンパイルされるのはなぜですか?

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

に見えるこのコード:

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

なぜそれが起こるん、それは.NET 3.5には一致しない正規表現の理由になることができますか? 4.5では動作します。

+7

あなたは 'RegexOptions.SingleLine | RegexOptions.IgnoreCase'、つまり_and_ではなくビット単位の_or_ですか?おそらく、オプションはフラグ(2の累乗)であり、そのビットの任意の2つは0になります(これは列挙型の値に変換され、 'None'です)。 – CompuChip

+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 

ビット単位を適用すると、我々が得る:

10000 
AND 00001 
    ----- 
    00000 

は交換してください

RegexOptions.Singleline | RegexOptions.IgnoreCase 

与える:

ILSpyがでコンパイルされます
10000 
OR 00001 
    ----- 
    10001 

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

しかし、私は純4.5でどのような "作品" 知りませんが。私はちょうどあなたのコードをコンパイルしました。また、ILSpyも出力します:

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

+0

いつかフラグを正しく組み合わせる方法を学びます。ありがとうございました。 .Net 4.5については、同じテキストの同じ正規表現が、シングルラインオプションが正しく指定されているものの、XP(同じアセンブリ、デバッガ、リリースコンパイル)と一致しない場合と同じように、基本的に、これは最初の私を混乱させるものです。 –

+0

きれいなプロジェクトで問題を再現できないため、たぶんテストが間違っていました。 –

関連する問題