5

Ich schrieb dieses Stück Code:Kann .NET Reflector den Nullkoaleszenzoperator nicht korrekt wiedergeben?

private Queue<int> EnsureQueue() 
{ 
    return _queue ?? (_queue = new Queue<int>(10)); 
} 

und der Reflektor gibt mir:

private Queue<int> EnsureQueue() 
{ 
    if (this._queue == null) 
    { 
    } 
    return (this._queue = new Queue<int>(10)); 
} 

Offensichtlich ist dies nicht das, was der ursprüngliche Code sagt. Die Zeile (this._queue = new Queue<int>(10)); wird immer eine new Queue<int>(10) anstelle von _queue zurückgeben, wenn es nicht null ist.

Ist das ein Fehler in der .NET Reflector oder fehle ich etwas? Das Programm scheint richtig zu verhalten ...

EDIT -> Siehe meine Antwort

+0

Die ?? Der Operator ist syntaktischer Zucker, Sie sehen, in was der Compiler ihn übersetzt. –

+0

@RonBeyer Aber die Ausgabe ist nicht korrekt, oder? – HerpDerpington

+3

Können Sie die rohe IL veröffentlichen? Es wäre wahrscheinlich viel klarer, wenn Sie sehen würden, von was der Reflektor zu übersetzen versucht. Normalerweise finde ich, dass JetBrains DotPeek etwas genauer ist als Redgates, und ich bin dagegen, Redgate zu benutzen, nachdem sie "versprochen" haben, Reflector frei zu halten, und dann unverschämt damit angefangen haben. DotPeek ist kostenlos. –

Antwort

3

Dies ist, was mein Exemplar von Reflector dieser Methode macht:

private Queue<int> EnsureQueue() 
{ 
    return (this._queue ?? (this._queue = new Queue<int>(10))); 
} 

Sieht verdammt gut an mich. Version 8.5.0.179, seien Sie sicher, Ihre zu aktualisieren.

+0

Ich habe tatsächlich die gleiche Version: 8.5.0.179 (Trial '??? !!!' (Ich hoffe, das ist nicht die Quelle des Problems)) – HerpDerpington

+0

Das ist sehr unwahrscheinlich. Vielleicht solltest du ein besseres Snippet posten, ich musste die Variable _queue erraten. –

+0

Gibt es irgendwelche Optionen für Reflector, wie C# Version, Compiler-Version, wie bestimmte Konstrukte usw. zu dekompilieren? –

Verwandte Themen