Zum Inhalt springen

Warnung CS0252


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.

 

Geschrieben

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.

 

Geschrieben (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 von Whiz-zarD
Geschrieben (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 von Whiz-zarD
Geschrieben
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... 🙄

Geschrieben (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 von Whiz-zarD
Geschrieben (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 von r4phi

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...