una net literal interpolación declarar cadenas cadena c# .net vb.net visual-studio-2015 string.format

c# - net - Interpolación de cadenas en Visual Studio 2015 e IFormatProvider(CA1305)



net core string format (3)

El nuevo estilo de interpolación de cadenas en Visual Studio 2015 es este:

Dim s = $"Hello {name}"

Pero si uso esto, el análisis de código me dice que rompo CA1305: Especifique IFormatProvider

En los viejos tiempos lo hice así:

Dim s = String.Format(Globalization.CultureInfo.InvariantCulture, "Hello {0}", name)

Pero, ¿cómo se puede hacer con el nuevo estilo?

Debo mencionar que estoy buscando una solución para .Net 4.5.2 (para .Net 4.6 dcastro tiene la respuesta )


He encontrado un Nuget-Package que cubre el código que Jessehouwing presentó en su respuesta .

El paquete Nuget ''StringInterpolationBridge'' ( source ) agrega este código a cada proyecto.


Si tiene como objetivo .NET Framework 4.6, puede aprovechar el hecho de que las interpolaciones de cadenas son implícitamente convertibles a FormattableString :

Desde personalizar la interpolación de cadenas en C # 6 por Thomas Levesque

Un aspecto menos conocido de esta característica es que una cadena interpolada se puede tratar como una String , o como un IFormattable , dependiendo del contexto.

static string Invariant(FormattableString formattable) { return formattable.ToString(CultureInfo.InvariantCulture); } string text = Invariant($"{p.Name} was born on {p.DateOfBirth:D}");


Utilizarías la clase System.FormattableString o System.IFormattable :

IFormattable ifs = (IFormattable)$"Hello, {name}"; System.FormattableString fss = $"Hello, {name}"; // pass null to use the format as it was used upon initialization above. string ifresult = ifs.ToString(null, CultureInfo.InvariantCulture); string fsresult = fss.ToString(CultureInfo.InvariantCulture);

IFromattable compilar contra Framework 4.6, ya que IFromattable y FormattableString son clases que no existen en versiones anteriores. Por lo tanto, si se dirige a versiones anteriores de .NET Framework, no puede usar la sintaxis de interpolación sin desencadenar el error.

A menos que apliques un pequeño truco ( adaptado para compilar contra 4.6 RTM de la esencia de Jon Skeet y bifurcado a mi propia cuenta ). Simplemente agregue un archivo de clase a su proyecto que contenga:

Actualizar

Ahora también hay disponible un paquete de Nuget que proporcionará la misma funcionalidad para su proyecto (gracias por informarme de esto @habakuk).

install-package StringInterpolationBridge

O si desea lograr lo mismo sin agregar un ensamblaje adicional a su producto, agregue el siguiente código a su proyecto:

namespace System.Runtime.CompilerServices { internal class FormattableStringFactory { public static FormattableString Create(string messageFormat, params object[] args) { return new FormattableString(messageFormat, args); } } } namespace System { internal class FormattableString : IFormattable { private readonly string messageFormat; private readonly object[] args; public FormattableString(string messageFormat, object[] args) { this.messageFormat = messageFormat; this.args = args; } public override string ToString() { return string.Format(messageFormat, args); } public string ToString(string format, IFormatProvider formatProvider) { return string.Format(formatProvider, format ?? messageFormat, args); } public string ToString(IFormatProvider formatProvider) { return string.Format(formatProvider, messageFormat, args); } } }

Ver: