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 打印字典中的空值