C# 11插值字符串中除switch外还可嵌入哪些代码?
C# 11插值字符串中可嵌入的代码类型
首先明确核心规则:插值字符串的{ }内部只能容纳表达式(有明确返回值的代码片段),不能容纳语句(无返回值的执行逻辑,比如if语句就属于这类)。除switch表达式外,以下几类表达式都可以正常使用:
1. 三元运算符表达式
这是替代if-else逻辑最常用的方案,本身属于表达式,自带返回值:
string pageTitle = ""; string header = $"Header: {pageTitle == "" ? "No title" : pageTitle}";
C# 11支持换行提升可读性,写法如下:
string header = $"Header: { pageTitle == "" ? "No title" : pageTitle }";
2. 方法调用表达式
直接调用返回字符串(或可隐式转换为字符串)的方法:
string GetHeaderTitle(string title) => string.IsNullOrEmpty(title) ? "No title" : title; string pageTitle = ""; string header = $"Header: {GetHeaderTitle(pageTitle)}";
同样支持换行排版:
string header = $"Header: { GetHeaderTitle(pageTitle) }";
3. 空合并与空条件表达式
针对空值场景的简洁表达式:
string pageTitle = null; // 空合并运算符处理空值 string header = $"Header: {pageTitle ?? "No title"}"; // 结合空条件运算符处理带空值的复杂场景 string header = $"Header: {pageTitle?.Trim() ?? "No title"}";
4. 算术/逻辑表达式
只要最终结果能转换为字符串,这类基础表达式都可以嵌入:
int count = 0; string status = $"Item count: {count == 0 ? "Empty" : count.ToString()}"; // 直接嵌入算术运算 string total = $"Total: {100 + 200}";
5. 带返回值的Lambda表达式
虽然可读性较差,但符合表达式规则的Lambda也可以使用:
string pageTitle = ""; string header = $"Header: {((Func<string>)(() => pageTitle == "" ? "No title" : pageTitle))()}";
为什么if语句会报错?
if是语句,它仅执行逻辑分支但没有返回值,而插值字符串要求{ }内的代码必须返回一个可转换为字符串的值。switch表达式是C# 8引入的表达式类型,有明确的返回值,因此能正常嵌入。
内容的提问来源于stack exchange,提问作者DeborahK
相关产品推荐
相关产品推荐

