2016-04-02 10 views
2

Das folgende Programm kompiliert fein in Visual Studio 2015 Update 2 negiert Zurückkehren, sondern ein "Cast ist redundant" Warnung erzeugt wird:"Cast ist redundant" Warnung, wenn bool

class Program 
{ 
    static void Main(string[] args) 
    { 
     Program p = new Program(); 
     bool negated = p.NegateBool(true); 
    } 

    public bool NegateBool(object value) 
    { 
     // "Cast is redundant" warning. 
     return !(bool)value; 

     // No warning. 
     //return (bool)value; 

     // No warning. 
     //var negated = !(bool)value; 
     //return negated; 
    } 
} 

Wenn die "Quick Fix" zu akzeptieren Vorschlag, die Besetzung zu entfernen, kompiliert das Programm nicht mehr.

Dies geschieht nur, wenn die Umwandlung direkt in der return-Anweisung erfolgt und der Negationsoperator verwendet wird.

Wenn das Ergebnis in eine Variable eingegeben und dann zurückgegeben wird, wird keine Warnung generiert.

Weiß jemand, warum das passiert?

+0

Sie sollten wahrscheinlich einen Fehlerbericht mit dem Roslyn Team einreichen. Sie sind auf Github und normalerweise sehr hilfreich. – Joey

+1

Ja, bitte melden Sie einen Fehler auf https://github.com/dotnet/roslyn, falls Sie dies noch nicht getan haben. –

+0

Ich habe jetzt einen Fehlerbericht eingereicht. –

Antwort

-2

bool negiert = p.NegatedBool (true);

Compiler weiß bereits, dass Sie an diesem Punkt übergeben und Boolean. truee anstelle von true und es wird Ihnen einen Fehler geben. und wenn Sie True Compiler weiß, dass es ein boolean von system.boolean, einfach mit der Maus über wahr. so jetzt weiß der Compiler bereits, dass es ein Bool ist. Legen Sie einfach einen Debug-Punkt auf Ihre Methoden in der ersten Zeile. das ist die öffnende geschweifte Klammer, und gehe zum debuggen. Wenn Sie einen Watch-Wert hinzufügen, wissen Sie, dass er in seinem Typ etwas wie dieses Objekt {bool} anzeigen kann.

+0

Das Argument zu NegateBool ist vom Typ Objekt. Das klingt wie ein Roslyn-Virus. – Joey

+0

hmmm ... nun, ich denke, er sollte seine Methode als öffentliche bool NegateBool (bool Wert) deklarieren. das ist one way .. –

+0

Hier geht es nicht um fragwürdige Programmierpraxis. Ja, der Code wie er ist ist unnötig kompliziert. Und ja, es könnte vereinfacht werden. Aber darum geht es nicht. Hier geht es um ein merkwürdiges Verhalten eines Analysators und eine schnelle Lösung, die eine Änderung vorschlägt, die die Kompilierung des Programms verhindert. Der Code, den sie dort haben, ist wahrscheinlich ein minimales Beispiel und wird nicht wörtlich aus einem tatsächlichen Projekt übernommen. – Joey

Verwandte Themen