wann und wie entscheidet es, dass es „kann nicht“ - kann nicht implizit Typ ‚X‘ zu ‚string‘ konvertieren?

StackOverflow https://stackoverflow.com/questions/751303

  •  09-09-2019
  •  | 
  •  

Frage

Im Moment habe ich es mit Guids.

Ich erinnere mich sicher, dass diese implizite Konvertierung funktioniert, über den gesamten Code an einigen Stellen in anderen nicht. Bis jetzt nicht ich das Muster sehen.

Wie der Compiler entscheidet, wann es nicht? Ich meine, ist die Art Methode Guid.ToString() vorhanden ist, ist es nicht aufgerufen, wenn diese Transformation benötigt wird?

Kann jemand bitte sagen Sie mir, unter welchen Umständen diese Umwandlung geschieht automatisch und wenn ich ausdrücklich myInstance.ToString() anrufen?

War es hilfreich?

Lösung

Kurz gesagt, wenn es ein impliziter oder expliziter Umwandlungsoperator definiert:

class WithImplicit {
    public static implicit operator string(WithImplicit x) {
        return x.ToString();}
}
class WithExplicit {
    public static explicit operator string(WithExplicit x) {
        return x.ToString(); }
}
class WithNone { }

class Program {
    static void Main() {
        var imp = new WithImplicit();
        var exp = new WithExplicit();
        var none = new WithNone();
        string s1 = imp;
        string s2 = (string)exp;
        string s3 = none.ToString();
    } 
}

Andere Tipps

Nein, es gibt keine implizite Konvertierung von GUID zu String, so dass nicht überall im Code überhaupt nicht funktioniert.

Es funktioniert nur, wenn es eine explizite Konvertierung ist, aber die Umwandlung möglicherweise nicht sehr sichtbar. Zum Beispiel, wenn Sie verketten Zeichenfolge:

string id = "--" + guidValue + " : " + num;

Dies mag wie eine implizite Konvertierung von GUID aussehen String, aber es ist nicht. Der Code, der erzeugt wird, sieht tatsächlich wie folgt aus:

string id = String.Concat(new object[] { "--", guidValue, " : ", num });

Alle Operanden werden auf den Typ Object gegossen und in einer Reihe angeordnet. Die String.Concat Methode ruft dann die ToString Methode für jedes Element im Array für sie, die String-Darstellung zu erhalten.

Der einzige Ort, wo man effektiv brauchen nicht ToString () aufzurufen, selbst, wenn Strings verketten.

Guid g;
int i;
string s = "Hello "+g+' '+i;

Dann gibt es einige Situationen, in denen der Anruf vom .NET Framework gemacht wird, wie in String.Format () .

Other than that, wird der Compiler nur einen Typen umwandeln, wenn bekannt ist kompatibel zu sein (zum Beispiel Basisklasse oder eine Schnittstelle implementiert oder über einen explizit kodierte Umwandlungsoperator). Wenn Sie einen Guss verwenden und der Compiler weiß, dass die Arten nicht kompatibel sein können (z nicht in der gleichen Vererbungslinie und nicht-Schnittstellen), wird es auch sagen, dass es sie nicht konvertieren kann. Das gleiche gilt für generischen Typparameter.

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