Frage

Der folgende Code führt einen Fehler bei der Kompilierung wie

Kann nicht Typ 'string' auf 'int'

konvertieren
string name = Session["name1"].ToString();
int i = (int)name;

, während der folgende Code kompiliert und ausgeführt erfolgreich:

string name = Session["name1"].ToString();
int i = Convert.ToInt32(name);

Ich möchte wissen:

  1. Warum hat den der erste Code generiert einen Fehler bei der Kompilierung?

  2. Was ist der Unterschied zwischen den zwei Code-Snippets?

War es hilfreich?

Lösung

(int)foo ist einfach eine Umwandlung in dem Int32 (int in C #) eingeben. Dies wird in den CLR gebaut und erfordert, dass foo eine numerische Variable (z float, long, etc.) In diesem Sinne ist es sehr ähnlich wie bei einem eingegossenen C.

Convert.ToInt32 ist so konzipiert, eine allgemeine Umwandlungsfunktion zu sein. Es macht viel mehr als Gießen; Es kann nämlich konvertieren von jeder Urtyp zu einem int (vor allem, einen string Parsen). Sie können die vollständige Liste der Überlastungen für diese Methode finden Sie unter hier auf MSDN .

Und wie Stefan Steiger erwähnt in einem Kommentar :

  

Beachten Sie auch, dass auf einer numerischen Ebene (int) foo kürzt foo (ifoo = Math.Floor(foo)), während Convert.ToInt32(foo) verwendet Hälfte sogar Runden (Runden x.5 auf die nächste gerade ganze Zahl, was bedeutet, ifoo = Math.Round(foo)). Das Ergebnis ist also nicht nur die Implementierung weise, aber auch numerisch nicht die gleiche.

Andere Tipps

(diese Zeile bezieht sich auf eine Frage, die verschmolzen wurde) Sie sollten nie (int)someString verwenden. - Das wird nie funktionieren (und der Compiler wird nicht im Stich lassen)

Allerdings int int.Parse(string) und bool int.TryParse(string, out int) (und ihre verschiedenen Überlastungen) sind Freiwild.

Ich persönlich vor allem nur Convert verwenden, wenn ich mit Reflexion zu tun habe, so dass für mich die Wahl Parse und TryParse ist. Die erste ist, wenn I erwartet der Wert eine gültige ganze Zahl zu sein, und will es sonst eine Ausnahme zu werfen. Das zweite ist, wenn ich will prüfen , wenn es sich um eine gültige ganze Zahl ist. - Ich kann dann entscheiden, was zu tun ist, wenn es / ist nicht

von diesem Zitat Eric Lippert Artikel :

  

Die Besetzung bedeutet zwei gegensätzliche Dinge: „überprüfen, um zu sehen, ob das Objekt wirklich von dieser Art ist, werfen, wenn es nicht“ und „Diese Aufgabe ist nicht von der gegebenen Art, finden Sie mir eine Gegenwert, der den gegebenen Typen gehört “.

Also, was Sie versuchen, in 1 zu tun) ist behaupten, dass ja ein String ein Int. Aber diese Behauptung nicht, da String kein int.

Der Grund, 2.) erfolgreich ist, weil Convert.ToInt32 () die Zeichenfolge analysiert und gibt einen int. Es kann immer noch nicht, zum Beispiel:

Convert.ToInt32("Hello");

in einem Argument Ausnahme führen.

summieren, aus einem String zu einem Int Umwandlung eine Rahmens Sorge ist, nicht etwas implizit in dem .NET-Typ-System.

Eine Zeichenfolge kann nicht in einem int durch explizites Gießen gegossen werden. Es muss mit int.Parse umgewandelt werden.

Convert.ToInt32 wickelt im Grunde diese Methode:

public static int ToInt32(string value)
{
    if (value == null)
    {
        return 0;
    }
    return int.Parse(value, CultureInfo.CurrentCulture);
}

Sie sprechen von einem C # Gießvorgang vs .NET Conversion Utilities

  • C #-Ebene Casting verwendet Klammern - zB (Int) - und die Umwandlung Unterstützung dafür begrenzt ist, auf implizite Kompatibilität zwischen den Typen zu verlassen, oder explizit vom Entwickler definiert Befehlen über Konvertierungsoperator .
  • existieren viele Konvertierungsmethoden in .NET Framework, z.B. System.Convert , ermöglichen Umwandlung zwischen gleichen oder unterschiedlichen Datentypen.

(Casting) Syntax funktioniert auf numerische Datentypen, und auch auf "kompatibel" Datentypen. Kompatibel bedeutet, Datentypen, für die es eine Beziehung durch Vererbung (d Base / abgeleiteten Klassen) oder durch Umsetzung (d.h. Schnittstellen).

hergestellt ist

Gießen kann auch zwischen unterschiedlichen Datentypen arbeiten, die

Es gibt keine Standardumsetzungs aus Zeichenfolge in .NET in int. Sie können int.Parse () oder int.TryParse () verwenden, um dies zu tun. Oder, wie Sie getan haben, können Sie Convert.ToInt32 ().

Doch in Ihrem Beispiel, warum eine ToString () und es dann überhaupt in einen int zurück zu konvertieren? Sie konnten die int in Session einfach speichern und abrufen wie folgt:

int i = Session["name1"];

1) C # ist sicher Sprache eingeben und erlaubt Ihnen nicht Zeichenfolge Nummer zuweisen

2) zweiter Fall analysiert die Zeichenfolge neue Variable.  In Ihrem Fall, wenn die Session ist ASP.NET-Sitzung als Sie müssen Zeichenfolge nicht speichern es und wandelt es zurück, wenn das Abrufen

int iVal = 5;
Session[Name1] = 5;
int iVal1 = (int)Session[Name1];

Convert.ToInt32

    return int.Parse(value, CultureInfo.CurrentCulture);

aber (int) ist Typumwandlung, so (int) „2“ wird nicht funktionieren, da Sie nicht Zeichenfolge werfen können in int. aber man kann es wie Convert.ToInt32 analysieren tun

Der Unterschied besteht darin, dass das erste Schnipsel ist ein gegossenes und das zweite ist ein Konvertit. Obwohl, ich glaube, vielleicht der Compiler-Fehler wird mehr Verwirrung hier wegen der Formulierung bereitstellt. Vielleicht wäre es besser, wenn es „, sagte Kann nicht Typ‚string‘zu‚int‘werfen.

Das ist alt, aber ein anderer Unterschied ist, dass (int) abzurunden nicht die Zahlen, falls Sie ein Doppel ej haben: 5.7 die ouput (int) verwendet, wird sein 5 und wenn Sie verwenden Convert.ToInt () die Zahl wird bis 6 abrunden.

Dies wird bereits diskutiert, aber ich möchte ein dotnetfiddle teilen.

Wenn Sie mit arithmetischen Operationen handeln und mit Schwimmer, dezimal, Doppel- und so weiter, sollten Sie besser verwenden Convert.ToInt32 ().

using System;

public class Program
{
  public static void Main()
  {
    double cost = 49.501;
    Console.WriteLine(Convert.ToInt32(cost));
    Console.WriteLine((int)cost);
  }
}

Output

50
49

https://dotnetfiddle.net/m3ddDQ

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