我有一个日志记录场景,其中使用了两个重载,用于string和FormattableString
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重载:
Logger.Log("1 string"); // => "It's a string"
Logger.Log($"{1+1} interpolated string"); // => "It's a string"如果我显式地转换内插字符串,它就能工作。
Logger.Log((FormattableString)$"{1+1} interpolated string"); // => "It's an interpolated string"是否有任何方法可以为内插字符串调用FormattableString重载,而不必在任何地方添加强制转换?
就一些背景而言:
记录器必须运行,而不引发异常。
在内存压力很高的情况下,即使是内插字符串(或者更确切地说,将其物化为普通字符串)也可以抛出OutOfMemoryException,因为它在封面下称为string.Format(),它使用一个执行内存分配的StringBuilder:
var s = $"this is {1+1} interpolated"; //can throw OOM!像这样的调用不能抛出:
Logger.Log($"interpolated {1+1}");...so内插字符串的物化必须是递延,并在记录器中处理,并且任何异常都会被吞没。
发布于 2021-07-08 10:22:22
您需要引入不同类型的字符串隐式转换,请使用如下所示:
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());
}
}结果,
第一例:

第二个案件:

https://stackoverflow.com/questions/68299572
复制相似问题