2015-10-30 14 views
6

Questo codicePerché RegexOptions viene compilato su RegexOptions.None in MSIL?

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

dopo la compilazione si presenta così in ILSpy:

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

Perché accade e può essere il motivo di espressione regolare non corrispondenti a Net 3.5? Il 4.5 funziona.

+7

Non intendi "RegexOptions.SingleLine | RegexOptions.IgnoreCase', cioè un bit _or_ bit al posto di _and_? Presumibilmente le opzioni sono flag (potenze di due) così bit a bit e di due qualsiasi di esse darà zero (che, convertito in un valore enum, è 'None'). – CompuChip

+0

Sì, quello ha fatto il trucco. Grazie. –

risposta

14
RegexOptions.Singleline & RegexOptions.IgnoreCase 

è un AND bit per bit, e decide di 0 (cioè RegexOptions.None).

Il RegexOptions enum assomiglia a questo:

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

Così, in binario, abbiamo:

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

Quando si applica un AND bit per bit, otteniamo:

10000 
AND 00001 
    ----- 
    00000 

Sostituire con

RegexOptions.Singleline | RegexOptions.IgnoreCase 

che dà:

10000 
OR 00001 
    ----- 
    10001 

Che ILSpy sarà decompilare in:

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

Ma io non so che cosa "lavora" in .Net 4.5. Ho appena compilato il tuo codice e ILSpy emette anche:

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

come previsto.

+0

Un giorno imparerò come combinare le bandiere correttamente. Grazie. Per quanto riguarda .Net 4.5, confermo che la stessa espressione regolare sullo stesso testo corrisponde alla mia macchina di sviluppo come se l'opzione singleline fosse specificata correttamente, ma non riuscisse a corrispondere su XP (stesso assembly, nessun debugger, compilazione di rilascio). Fondamentalmente, questo è ciò che mi ha confuso in primo luogo. –

+0

Molto probabilmente si trattava di test errati in quanto non riesco a riprodurre il problema sul progetto clean. –

Problemi correlati