如何让字符串插值运算符 $ 打印空参数的"null"?


string o=null;
Console.WriteLine($"Hello World '{o}'");

该输出:

Hello World">

我想明确地写";空";用于null值。

string o=null;
Console.WriteLine($"Hello World '{o??"null"}'");

这样做只是为了:

Hello World‘null’

但如果o的类型不是string(或Object(,则会生成编译错误。例如:

Array o=null;
Console.WriteLine($"Hello World '{o??"null"}'");

编译错误运算符"??"不能应用于类型为"Array"one_answers"string"的操作数

实现预期结果的最佳方式是什么?遗憾的是,您无法修改$处理null的方式,因为它似乎被硬编码为使用String.EmptyString

您可以将"null"强制转换为object,以便??可以应用于所有类型的操作数。

$"Hello World '{o ?? (object)"null"}'"

您可以利用$将您的字符串转换为formattablestring,并且您可以提供一个自定义格式的字符串,它将在依次处理每个arg时调用该字符串。类似于为排序函数提供自定义比较器


class NullyFormatProvider : IFormatProvider
{
private readonly NullyFormatter _formatter = new NullyFormatter();
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
return _formatter;
return null;
}
class NullyFormatter : ICustomFormatter
{
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if (arg == null)
return "arg was null, bro!";
else
return arg.ToString();
}
}
}

您可以通过一个函数来触发null格式提供程序,该函数将使c#将其视为可格式化字符串(而不是编译器直接调用其上的字符串格式(:

static string NullyVersion(FormattableString formattable)
{
return formattable.ToString(new NullyFormatProvider());
}
...
Array o = null;
string txt = NullyVersion($"check out this array: {o}");

当然,你不会让它变得这么长/你可能不会使用NullyVersion来创建一个字符串,以便在你想要字符串的地方使用。。你会把你的例如";获取字符串"的日志记录方法;改为使用FormattableString,然后使用nully格式化程序对其进行格式化,可能类似于:

static string Log(FormattableString formattable)
{
Console.WriteLine( formattable.ToString(new NullyFormatProvider()); //or some instance of NFP
}

然后你可以像一开始想要的那样在代码中使用:

Array o = null;
Log($"Data was {o}");

我还没有深入研究如何检查你是否收到了采用格式的东西——你会注意到ICustomFormatter中的format((方法采用了string format——如果你写了Log($"it is now {DateTime.Now:yyyyMMdd} woo"),那么object arg将是日期时间,string format将包含"yyyyMMdd"——它可以是你想要的任何东西。你可以定义自己的:

int[] nums = {1,2,3};
Log($"those nums are {nums:csv}");

以您的格式:

if(format == "csv" && arg is int[] x)
//turn the passed in arg (an int array inside an obj) into some csv representation...
return string.Join(",", x.Select(e => e.ToString()));

有关更多详细信息,请参阅ICustomFormatterhttps://learn.microsoft.com/en-us/dotnet/api/system.icustomformatter?view=netcore-3.1

如果变量不为null,我不确定您想要打印什么,但您可以尝试三元条件运算符

Array o = null;
Console.WriteLine($"Hello World '{(o == null ? "null" : "not null")}'");

Array o = null;
Console.WriteLine($"Hello World '{(o == null ? "null" : o.ToString())}'");

这取决于CCD_ 15是什么以及您是否覆盖了CCD_。


相关:

如何使用LINQ 打印字典中的空值

相关内容

  • 没有找到相关文章

最新更新