Подтвердить что ты не робот

Указание языка для интерполяции строк в С# 6 (Roslyn CTP6)

Строковая интерполяция в С# 6 позволяет мне написать:

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

Однако очень распространенный вариант использования форматирования строк - это указать язык, используемый для форматирования значений. Скажем, мне нужно использовать InvariantCulture для операции форматирования выше, для чего это синтаксис?

Это обсуждение предполагает, что я должен это сделать:

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

Где INV определяется как

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

Однако это не работает. Он компилируется, но он оставляет мою программу зависающей в cmd.exe при запуске - как будто klr.exe, который, как я предполагаю, вызывается, зависает (ошибка компилятора?)

Это проект консоли ASP.NET 5 в VS15 CTP 6.

4b9b3361

Ответ 1

Я, наконец, понял это. Как оказалось, функция компилятора опирается на два типа: System.FormattableString и System.Runtime.CompilerServices.FormattableStringFactory. Они не были доступны для моего проекта - я думаю, они, возможно, еще не сделали его на всех платформах для CTP6.

Это, по-видимому, заставило компилятор висеть, как описано. Как только я вытащил код для этих двух типов из кода CoreCLR и добавил его в свой проект, мой код работает так, как ожидалось.

Это было выяснено с помощью кодовых комментариев для InterpolationTests. Ура для источника, доступного: -)

Ответ 2

Что вы должны работать. Это правильный синтаксис. Также существует удобный метод в абстрактном классе "System.FormattableString", который имеет тот же эффект, что и предлагаемый вспомогательный метод "INV".

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