String Interpolation in Visual Studio 2015 and IFormatProvider (CA1305)

前端 未结 4 1292
陌清茗
陌清茗 2021-02-02 08:21

The new string interpolation style in Visual Studio 2015 is this:

Dim s = $\"Hello {name}\"

But if I use this the code analysis tells me I brea

4条回答
  •  伪装坚强ぢ
    2021-02-02 09:19

    You'd use the System.FormattableString or System.IFormattable class:

    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);
    

    You need to be compiling against Framework 4.6, as the IFormattable and FormattableString are classes which do not exist in older versions. So if you're targeting older versions of the .NET framework you can't use the interpolation syntax without triggering the error.

    Unless you apply a little hack (adapted to compile against 4.6 RTM from Jon Skeet's gist and forked to my own account.). Just add a class file to your project containing:

    Update

    There is now also a Nuget package available that will provide the same functionality to your project (thanks for bringing this to my attention @habakuk).

    install-package StringInterpolationBridge
    

    Or if you want to achieve the same thing without adding an additional assembly to your product add the following code to your project:

    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);
            }
        }
    }
    

    See:

    • https://msdn.microsoft.com/en-us/library/dn961160.aspx

提交回复
热议问题