web-dev-qa-db-fra.com

Spécification des paramètres régionaux pour l'interpolation de chaînes en C # 6 (Roslyn CTP6)

L'interpolation de chaînes en C # 6 me permet d'écrire:

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

Cependant, un cas d'utilisation très courant pour le formatage de chaîne consiste à spécifier les paramètres régionaux utilisés pour le formatage des valeurs. Disons que je dois utiliser InvariantCulture pour l'opération de formatage ci-dessus, quelle est la syntaxe pour cela?

Cette discussion suggère que je devrais pouvoir faire ceci:

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

Où INV est défini comme

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

Cependant, cela ne fonctionne pas. Il compile, mais il laisse mon programme suspendu dans cmd.exe au démarrage - comme si klr.exe, que je suppose être invoqué, se bloque (bogue du compilateur?)

Il s'agit d'un projet de console ASP.NET 5 dans VS15 CTP 6.

56
driis

J'ai finalement compris cela. En fait, la fonction de compilation repose sur deux types, System.FormattableString et System.Runtime.CompilerServices.FormattableStringFactory . Ceux-ci n'étaient pas disponibles pour mon projet - je suppose qu'ils ne l'ont peut-être pas encore fait sur toutes les plates-formes pour CTP6.

Cela a apparemment fait bloquer le compilateur comme décrit. Une fois que j'ai extrait le code de ces deux types du code CoreCLR et que je l'ai ajouté à mon projet, mon code fonctionne comme prévu.

Cela a été compris grâce aux commentaires de code pour les InterpolationTests . Hourra pour la source disponible :-)

17
driis

Ce que vous avez devrait fonctionner. C'est la syntaxe correcte. Il existe également une méthode pratique sur la classe abstraite "System.FormattableString" qui a le même effet que la méthode d'assistance "INV" suggérée.

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