Frage

ich möchte Typumwandlung in c # .net wissen, ich habe unten Codezeilen.

int i=4
object o = i // This works properly without any typecasting becausing boxing takes place automatically
string s= i // This does not work, even when the string is also reference type?
string s=(string)i //This also does not work even if i try to typecast the int to string.
string s= Convert.ToString(i); // this works.

also möchte ich wissen warum string s = i and string s = (string)i funktioniert nicht und was ist der Unterschied bei der Verwendung (string)i, i.ToString(), and Convert.ToString(i).

War es hilfreich?

Lösung

Wenn es um Boxen und Unboxing geht, haben Typen explizites und implizites Casting.Unter bestimmten Umständen ist es für die Laufzeit einfach genug, eine implizite Konvertierung zwischen zwei unterstützten Typen zu ermöglichen, z. B. einem Int32 in ein Double .Es gibt jedoch keine implizite oder explizite Konvertierung zwischen einer Ganzzahl und einer Zeichenfolge, da eine Zeichenfolge offensichtlich keine Ganzzahl ist (obwohl eine Zeichenfolge Zeichen für eine Ganzzahl enthalten kann).

string s = i; // attempt at implicit cast from Int32 to String, error
object o = i; // all types inherit from Object, so you may implicitly or explicitly cast from Int32 to Object.
s = (string)i; // attempt at explicit cast from Int32 to string, error
s = i.ToString(); // conversion
s = Convert.ToString(i); // conversion

Das ist wo Convert kommt zum Spielen. Convert enthält Unterstützung für den Versuch, bekannte Grundelemente (und Typen, die dies unterstützen) zu konvertieren IConvertable) zu einem anderen.So, ToString oder Convert.ToString wären die bevorzugten Methoden (toString und Convert.toString sind praktisch synonym, außer dass toString Ihnen einige Formatierungsoptionen bietet).

Andere Tipps

Gut, string und object - beide sind Referenztypen.Jedoch, object ist ein Root-Typ für alle .NET-Typen.

Wenn Sie eine solche Syntax verwenden wie (string)i, versuchen Sie, eine explizite Konvertierung zwischen Typen zu verwenden.Dieser Konvertierungstyp erfordert jedoch string klasse, um alle möglichen Argumenttypen zu kennen.

Also haben wir .ToString() methode, die in jeder Klasse überschrieben werden kann, und ihr Rückgabewert wird als Zeichenfolgendarstellung eines beliebigen Objekts verwendet.

zeichenfolge s = i und Zeichenfolge s = (Zeichenfolge) i funktioniert nicht

weil I keine Zeichenfolge ist und Typumwandlung eine UMWANDLUNG des Typs ist, keine Konvertierung.Es funktioniert nur, wenn i eine Zeichenfolge oder eine Unterklasse von Zeichenfolge enthält (was für Zeichenfolgen nicht möglich ist, aber möglicherweise für andere Klassen).

was ist der Unterschied bei der Verwendung von (string)i , i.toString() und Convert .toString(ich).

  • (schnur) i:umwandlung von i in eine Zeichenfolge, muss zuweisbar sein.

  • ich.toString():ruft die Methode ToSstring auf, die auf dem System definiert ist.objekt, also auf ALLEN Klassen und Strukturen verfügbar - gibt aber keinen sinnvollen Inhalt zurück, wenn er nicht überschrieben wird.

  • Konvertieren.toString(ich):konvertiert i in einen String.Dies beinhaltet das Aufrufen eines Konverters, der in diesem seltenen Fall wahrscheinlich nur toString aufruft.

Am Ende ist Casting keine Konvertierung.damit (string) i funktioniert, MUSS ICH EIN STRING SEIN, während convert versucht, daraus einen String zu MACHEN.

Sie können implizite und explizite Konvertierungen in .net angeben.Der Grund dafür, dass string s = i fehlschlägt, ist, dass keine integrierte Umwandlungsoperation für eine Ganzzahl in eine Zeichenfolge vorhanden ist.

sehen Sie das MSDN-Artikel auf Casting für weitere Informationen

string s= i funktioniert nicht, weil die Typen nicht übereinstimmen, int wird nicht in eine Zeichenfolge eingefügt.

string s=(string)i funktioniert nicht, weil nicht angenommen werden kann, welche Typkonvertierung verwendet werden soll (dh welche Basis)

so etwas wie s = ""+i würde auf der anderen Seite so funktionieren, als würde es eine Basis-10-Konvertierung annehmen.

also möchte ich wissen warum string s = i und string s = (string)i funktioniert nicht

Die kurze Antwort lautet, dass weder implizit (erstes Beispiel oben) noch explizit (zweites Beispiel oben) eine Umwandlung von int in string definiert ist.Etwas längere Antwort;beim Erstellen der Struktur Int32 in C # wurde kein Casting-Verhalten programmiert, damit der Entwickler automatisch von einem int in einen String umwandeln kann

was ist der unterschied bei der verwendung von (string)i, i.ToString(), und Convert.ToString(i)

Nun, das erste funktioniert nicht so, wie du gesagt hast und wie ich oben erklärt habe.Der zweite ruft die ToString methode auf der Struktur Int32, das (wie der Name schon sagt) eine Zeichenfolgendarstellung des Objekts zurückgibt.Es sollte beachtet werden, dass dies eine brandneue Zeichenfolge ist, die in keiner Weise mit dem ursprünglichen Wert zusammenhängt.Das dritte Beispiel Convert.ToString ruft unter der Haube die am besten geeignete Methode auf, um den übergebenen Parameter in eine Zeichenfolge umzuwandeln - ruft höchstwahrscheinlich nur die auf ToString methode - also ziemlich identisch mit Beispiel 2.

ToString() die Methode wird von jeder Referenz überschrieben, die eine wichtige Methode in der Objektklasse ist.string-Calss überschreiben diese Methode und geben daraus einen String-Wert an.

Die Standardimplementierung der toString-Methode gibt den vollständig qualifizierten Namen des Objekttyps zurück, wie im folgenden Beispiel gezeigt.

 Object obj = new Object();
      Console.WriteLine(obj.ToString());

// The example displays the following output:
//      System.Object

dieses Verhalten wird von Referenztypen geerbt, die die toString-Methode nicht überschreiben.

Typumwandlung in C # funktioniert nur nach dem Vorbild der Klassenvererbung.Object ist die Wurzel aller Typen in C # und daher können alle Werte darauf typisiert werden.

string und int teilen Sie nicht denselben Vererbungszweig und können daher nicht direkt von einem zum anderen umgewandelt werden.

Convert.ToString() ist eine Methode zum Konvertieren einer Ganzzahl in eine Zeichenfolge - es findet keine Typumwandlung statt, es wird nur eine Methode ausgeführt, die zum Konvertieren einer Ganzzahl in eine Zeichenfolgendarstellung entwickelt wurde.

i.ToString() führt die äquivalente Funktionalität aus zu Convert.ToString(), außer dass i.ToString() hat Überladungen, die eine größere Flexibilität bei der Darstellung der Zahl im Zeichenfolgenformat ermöglichen.

Eine letzte Anmerkung, Ausnahmen von den Typumsetzungsregeln können vom Entwickler mit einem eingefügt werden public static explicit operator methode, die es dem Entwickler ermöglicht, einen Wert nach Belieben in einen anderen umzuwandeln.

Als erstes ist zu beachten, dass jede Klasse von object abgeleitet ist.

Das Umwandeln von int in ein Objekt verwendet ein Int32.

Beim Umwandeln von Zeichenfolge in Objekt wird eine Zeichenfolge verwendet.

Es gibt keine implizite Umwandlung von einer Ganzzahl in eine Zeichenfolge, da sie sich in verschiedenen Teilen der Klassenhierarchie befinden - einer bezieht sich in keiner Weise auf einen anderen.Da string jedoch so oft für das Ausgabeobjekt (und damit für alle seine untergeordneten Objekte) verwendet wird, gibt es der Einfachheit halber eine toString () -Methode.

Convert wurde jedoch speziell geschrieben, um von einem Typ in einen anderen konvertieren zu können, z. B. Convert .ToBool(x) kann "true" oder "false" in boolean analysieren, und wie Sie gezeigt haben, kann es eine Ganzzahl in eine Zeichenfolge konvertieren - auch dies ist wirklich eine Annehmlichkeit, die wahrscheinlich nur Int32 aufruft.toString() unter der Haube.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top