Specifying locale for string interpolation in C#6 (Roslyn CTP6)

C#RoslynC# 6.0String Interpolation

C# Problem Overview


String interpolation in C#6 lets me write:

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

However, a very common use case for string formatting is to specify the locale used for formatting the values. Let's say I need to use InvariantCulture for the formatting operation above, what is the syntax for that ?

This discussion suggests that I should be able to do this:

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

Where INV is defined as

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

However, this does not work. It compiles, but it leaves my program hanging at in cmd.exe at startup - as if klr.exe, that I assume is being invoked, hangs (Compiler bug?)

This is an ASP.NET 5 Console Project in VS15 CTP 6.

C# Solutions


Solution 1 - C#

What you have should work. It's the correct syntax. There's also a convenient method on the "System.FormattableString" abstract class which has the same effect as the suggested "INV" helper method.

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

Solution 2 - C#

I finally figured this out. As it turns out, the compiler feature relies on two types, System.FormattableString, and System.Runtime.CompilerServices.FormattableStringFactory. These were not available for my project - I guess they might not yet have made it into all platforms for CTP6.

This apparently made the compiler hang as described. Once I pulled the code for those two types from the CoreCLR code and added it to my project, my code works as expected.

This was figured out through code comments for the InterpolationTests. Hooray for the source being available :-)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiondriisView Question on Stackoverflow
Solution 1 - C#pharringView Answer on Stackoverflow
Solution 2 - C#driisView Answer on Stackoverflow