MMazi Geschrieben 19. November 2020 Geschrieben 19. November 2020 Hi Ich habe diese Codezeile Fehler: Warnung CS0252 Möglicher unbeabsichtigter Referenzvergleich; Um einen Wertevergleich zu erhalten, geben Sie auf der linken Seite 'string' ein. private void btnStart_Click(object sender, RoutedEventArgs e) { if (btnStart.Content == "Start") { _currentTimer = new Timer(); txtStart.Text = _currentTimer.Start.ToString("HH:mm:ss"); btnStart.Content = "Ende"; } else { // Objektvariablen, die nicht initialisiert sind und daher auf nichts verweisen: DateTime Ende = new DateTime(2020, 11, 10, 0, 0, 0); _currentTimer.Ende = DateTime.Now; _currentTimer.Dauer = _currentTimer.Ende - _currentTimer.Start; txtEnde.Text = _currentTimer.Ende.ToString("HH:mm:ss"); Timer.Add(_currentTimer); //private void btnEnde_Click(object sender, RoutedEventArgs e) //{ } foreach (Control tbx in Controls) { if (tbx.GetType() == typeof(TextBox)) { ((TextBox)tbx).Clear(); } } btnStart.Content = "Start"; } wäre ich dankbar für die Antworten Zitieren
pr0gg3r Geschrieben 19. November 2020 Geschrieben 19. November 2020 Also ich bring mal bisschen bei, wie an Dokus liest.. Du hast die Methode getType. Da steht ind er Doku (https://docs.microsoft.com/de-de/dotnet/api/system.object.gettype?view=net-5.0) folgendes: Zitat public Type GetType (); Das heißt, bei GetType bekommst du ein Objekt vom Typ Type zurück. Natürlich kannst du jetzt kein Type mit einem String vergleichen. Wie soll das denn gehen?? Wie vergleicht man denn einen Apfel mit einem Fernseher? Also schauen wir uns mal an, was dieses Type eigentlich ist und so machen kann: https://docs.microsoft.com/de-de/dotnet/api/system.type?view=net-5.0. Vielleicht findest du hier eine Methode, die dir einen String zurück gibt. allesweg reagierte darauf 1 Zitieren
maestro impostor Geschrieben 19. November 2020 Geschrieben 19. November 2020 Gehen wir mal nur auf dein konkretes Problem: btnStart.Content = "Ende"; AFAIR ist Content vom Typ Objekt. Das heißt, du vergleichst in der Zeile Objekt mit String. Entsprechend bekommst du diese Warnung. Ich tippe darauf das die Beschriftung des Buttons überprüfen möchtest. Allerdings ist das scheinbar WPF. Damit hatte ich (leider) oder zum Glück nichts am Hut. Ein Content.ToString() könnte in einigen Fällen sicherlich knallen da WPF Buttons mehr an content haben können als "nur" Text. Zitieren
maestro impostor Geschrieben 19. November 2020 Geschrieben 19. November 2020 vor 4 Minuten schrieb pr0gg3r: Natürlich kannst du jetzt kein Type mit einem String vergleichen Wo tut er das den? Zitieren
Whiz-zarD Geschrieben 19. November 2020 Geschrieben 19. November 2020 (bearbeitet) Das Problem ist folgender Code: if (btnStart.Content == "Start") { // ... } btnStart.Content ist ein object und kein string . Du vergleichst im Worst Case zwei unterschiedliche Datentypen. Die Equals-Methode im object vergleicht nämlich nur die Referenzen miteinander und nicht den Inhalt. In deinem Fall klappt es zwar, weil String den ==-Operator überschreibt aber in anderen Fällen klappt es nicht und deswegen bekommst du hier vom Compiler eine Warnung, dass du Content in ein String casten solltest, um Fehler zu vermeiden. Bearbeitet 19. November 2020 von Whiz-zarD Zitieren
Whiz-zarD Geschrieben 19. November 2020 Geschrieben 19. November 2020 (bearbeitet) vor 4 Minuten schrieb r4phi: Wo tut er das den? nirgends. Der Code if (tbx.GetType() == typeof(TextBox)) { ((TextBox)tbx).Clear(); } ist schon richtig. Da liegt nicht der Fehler. Type hat nämlich ebenfalls den ==-Operator überschrieben. Bearbeitet 19. November 2020 von Whiz-zarD maestro impostor und MMazi reagierten darauf 1 1 Zitieren
maestro impostor Geschrieben 19. November 2020 Geschrieben 19. November 2020 Gerade eben schrieb Whiz-zarD: nirgends. Der Code if (tbx.GetType() == typeof(TextBox)) { ((TextBox)tbx).Clear(); } ist schon richtig. Da liegt nicht der Fehler. Eben, deshalb wunder ich mich auch über die Antwort. Das Type Checking an der Stelle ist 100% richtig. Aber Hauptsache Doku richtig gelesen... 🙄 pr0gg3r, MMazi und Whiz-zarD reagierten darauf 2 1 Zitieren
KeeperOfCoffee Geschrieben 19. November 2020 Geschrieben 19. November 2020 Wäre .Equals nicht besser, als den Content einfach mit ToString zu wandeln? Dann lernt er auch den Unterschied zwischen == und .Equals MMazi reagierte darauf 1 Zitieren
Whiz-zarD Geschrieben 19. November 2020 Geschrieben 19. November 2020 (bearbeitet) Die Überladung des ==-Operators in der String-Klasse ruft die statische Variante von Equals() auf: public static bool operator == (String a, String b) { return String.Equals(a, b); } Wenn man die Equals()-Methode an der Instanz nehmen möchte, müsste vorher noch auf null prüfen. Also: if(btnStart?.Content != null && btnStart.Content.Equals("Start")) { ... } Ich persönlich finde dies unschön. Wenn man aber weiß, dass da eh nur ein String drinnen sein kann, dann würde ich es in ein String casten. Also: if((string)btnStart.Content == "Start") { ... } Oder um eine Excepion zu verhindern eben die statsiche Variante; if(string.Equals(btnStart?.Content, "Start")) { ... } Bearbeitet 19. November 2020 von Whiz-zarD KeeperOfCoffee, MMazi und maestro impostor reagierten darauf 2 1 Zitieren
MMazi Geschrieben 19. November 2020 Autor Geschrieben 19. November 2020 Dankeschön für die Antworten , läuft ja damit ganz gut if((string)btnStart.Content == "Start") Zitieren
maestro impostor Geschrieben 19. November 2020 Geschrieben 19. November 2020 (bearbeitet) Ich würde @Whiz-zarD Vorschlage beherzigen: if(string.Equals(btnStart?.Content, "Start")) Das ist sauberer und sicherer. Zudem wird dort der NULL Condition operator verwendet (btnStart?.), wodurch du eine NPE verhinderst. Des weiteren machst du in deinem Beispiel ein Unboxing was "unsauber" ist. Bearbeitet 19. November 2020 von r4phi Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.