首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当参数是内插字符串时,默认情况下可以调用方法(FormattableString x)重载吗?

当参数是内插字符串时,默认情况下可以调用方法(FormattableString x)重载吗?
EN

Stack Overflow用户
提问于 2021-07-08 10:06:59
回答 1查看 136关注 0票数 2

我有一个日志记录场景,其中使用了两个重载,用于stringFormattableString

代码语言:javascript
复制
class Logger
{
    public static void Log(string s)
    { 
        Console.WriteLine("It's a string");
    }
    public static void Log(FormattableString s)
    { 
        Console.WriteLine("It's an interpolated string");
    }
}

但是,这两个调用都针对string重载:

代码语言:javascript
复制
Logger.Log("1 string"); // => "It's a string"
Logger.Log($"{1+1} interpolated string"); // => "It's a string"

如果我显式地转换内插字符串,它就能工作。

代码语言:javascript
复制
Logger.Log((FormattableString)$"{1+1} interpolated string"); // => "It's an interpolated string"

是否有任何方法可以为内插字符串调用FormattableString重载,而不必在任何地方添加强制转换?

就一些背景而言:

记录器必须运行,而不引发异常

在内存压力很高的情况下,即使是内插字符串(或者更确切地说,将其物化为普通字符串)也可以抛出OutOfMemoryException,因为它在封面下称为string.Format(),它使用一个执行内存分配的StringBuilder

代码语言:javascript
复制
var s = $"this is {1+1} interpolated"; //can throw OOM!

像这样的调用不能抛出:

代码语言:javascript
复制
Logger.Log($"interpolated {1+1}");

...so内插字符串的物化必须是递延,并在记录器中处理,并且任何异常都会被吞没。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-08 10:22:22

您需要引入不同类型的字符串隐式转换,请使用如下所示:

代码语言:javascript
复制
class Logger
    {
        public static void Log(String2 s)
        {
            Console.WriteLine("It's a string");
        }
        public static void Log(FormattableString s)
        {
            Console.WriteLine("It's an interpolated string");
        }

    }

    public class String2
    {
        public string Value { get; }

        private String2(string str)
        {
            Value = str;
        }

        public static implicit operator String2(string str)
        {
            return new String2(str);
        }
        public static implicit operator String2(FormattableString formattable)
        {
            return new String2(formattable.ToString());
        }
    }

结果,

第一例:

第二个案件:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68299572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档