webentwicklung-frage-antwort-db.com.de

Festlegen des Gebietsschemas für die Zeichenfolgeninterpolation in C # 6 (Roslyn CTP6)

Mit der Zeichenfolgeninterpolation in C # 6 kann ich schreiben:

decimal m = 42.0m;
string x = $"The value is {m}";

Ein sehr häufiger Anwendungsfall für die Formatierung von Zeichenfolgen ist jedoch die Angabe des Gebietsschemas, in dem die Werte formatiert werden. Angenommen, ich muss InvariantCulture für den obigen Formatierungsvorgang verwenden. Wie lautet die Syntax dafür?

Diese Diskussion legt nahe, dass ich dies tun sollte:

string x = INV($"The value is {m}");

Wobei INV definiert ist als

public static string INV(IFormattable formattable)
{
    return formattable.ToString(null, System.Globalization.CultureInfo.InvariantCulture);
}

Dies funktioniert jedoch nicht. Es kompiliert, aber mein Programm bleibt beim Start in cmd.exe hängen - als ob klr.exe, von dem ich annehme, dass es aufgerufen wird, hängen bleibt (Compiler-Fehler?)

Dies ist ein ASP.NET 5-Konsolenprojekt in VS15 CTP 6.

56
driis

Ich habe es endlich herausgefunden. Wie sich herausstellt, basiert die Compiler-Funktion auf zwei Typen: System.FormattableString und System.Runtime.CompilerServices.FormattableStringFactory . Diese waren für mein Projekt nicht verfügbar - vermutlich haben sie es noch nicht auf alle Plattformen für CTP6 geschafft.

Dies ließ den Compiler anscheinend wie beschrieben hängen. Nachdem ich den Code für diese beiden Typen aus dem CoreCLR-Code gezogen und meinem Projekt hinzugefügt habe, funktioniert mein Code wie erwartet.

Dies wurde durch Codekommentare für die InterpolationTests herausgefunden. Hurra für die Quelle, die verfügbar ist :-)

17
driis

Was Sie haben, sollte funktionieren. Es ist die richtige Syntax. Es gibt auch eine praktische Methode für die abstrakte Klasse "System.FormattableString", die dieselbe Wirkung hat wie die vorgeschlagene Hilfsmethode "INV".

using static System.FormattableString;
...
string x = Invariant($"The value is {m}");
78
pharring